【问题标题】:Conditional replacement of a comma with a dot in a numeric column有条件地用数字列中的点替换逗号
【发布时间】:2019-06-19 04:58:18
【问题描述】:

我目前正在清理一些德国数据。德国数据的格式与正常数据不同。在德语中,带两位小数的千位是 1.000,00 在英语中,它是 1,000.00 我想先删除 1.000,00 中的点,然后用点替换逗号,但前提是数字中同时存在逗号和点。 如果数字只有一个点而没有逗号,那么我想保留这个点。

我尝试了一个普通的gsub,但当然不是有条件的

tidy$obs_values<-as.character(gsub(",",".",tidy$obs_values)) 

简而言之,我需要的是:

#input
raw$obs_values<-c(1.000,00 , 8.3 , 2.900,00 , 9.2)

#output
raw$obs_values<-c(1000.00 , 8.3 , 2900.00 , 9.2)

【问题讨论】:

    标签: r gsub data-cleaning


    【解决方案1】:

    我们可以使用as.numericis.na 创建一个逻辑条件,因为如果值不是合法的数字语法,则转换为numeric 会返回NA。在示例中,第一个和第三个元素都有,,因此它被解释为character,从而得到NA。使用is.na,构造一个逻辑向量,然后在子向量上应用sub 的替换逻辑。不过,也可以使用grep 完成

    i1 <- is.na(as.numeric(str1))
    str1[i1] <- sub(",", ".", sub("\\.", "", str1[i1]))
    str1
    #[1] "1000.00" "8.3"     "2900.00" "9.2" 
    

    请注意,转换为 numeric 将删除尾随的零位

    as.numeric(str1)
    #[1] 1000.0    8.3 2900.0    9.2
    

    数据

    str1 <- c('1.000,00', 8.3, '2.900,00', 9.2)
    

    【讨论】:

    • @NelsonGon。我添加了更多描述。希望对你有帮助
    【解决方案2】:

    这是一种方法。我们可以用逗号分割每个术语,然后删除那些具有逗号/小数部分的数字的点。对于那些没有逗号的数字,我们只使用原始值。

    obs_values <- c("1.000,00", "8.3", "2.900,00", "9.2")
    
    output <- sapply(obs_values, function(x) {
        parts <- strsplit(x, ",")[[1]]
        return(ifelse(length(parts) > 1,
                      paste0(gsub("\\.", "", parts[1]), ".", parts[2]),
                      parts[1]))
    })
    
    output
    
     1.000,00       8.3  2.900,00       9.2 
    "1000.00"     "8.3" "2900.00"     "9.2" 
    

    【讨论】:

      【解决方案3】:

      这是一个非常粗略的stringr 尝试:

      raw<-c("1.000,00" , "8.3" , "2.900,00" , "9.2")
      new<-str_replace_all(raw,",(?=0)",".")
      str_remove_all(new,".(?=\\d{3,})")
      
      [1] "1000.00" "8.3"     "2900.00" "9.2"    
      

      或更一般地,正如@akrun 所建议的那样 您可以将 d 替换为 [0-9]

      new1<-str_replace_all(raw,",(?=\\d)",".")
          str_remove_all(new1,".(?=\\d{3,})")
      

      【讨论】:

        猜你喜欢
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多