【问题标题】:R, gsub(), replace "." for "," given some conditionsR,gsub(),替换“。”对于“,”给定一些条件
【发布时间】:2015-03-23 03:37:12
【问题描述】:

我有类似的数据

obs  Var1   
1    36.091  
2    14.678  
3    3.12

我的问题是我想用"," 替换"."gsub(),但不是针对所有观察结果,仅针对在点(".") 右侧有3 个字符的观察结果。在这种情况下,用于观察 1 和 2。

我在想这样的事情:

if ( nchar(something indicating the characters to the right of ".") >= 3){
gsub(".",",",data[,1])
} 
else {}

我不知道这是否是正确的方法,但我不知道另一种方法。

谢谢

【问题讨论】:

    标签: r if-statement replace gsub


    【解决方案1】:

    您可以使用基于前瞻的正则表达式。仅当点后跟至少三个字符时,这才会用逗号替换点。

    > x <- c('36.091', '14.678', '3.12')
    > gsub("\\.(?=.{3})", ",", x, perl=T)
    [1] "36,091" "14,678" "3.12"
    > df <- data.frame(obs=c(1,2,3), Var1=c('36.091', '14.678', '3.12'))
    > df$Var1 <- gsub("\\.(?=.{3})", ",", df$Var1, perl=T)
    > df
      obs   Var1
    1   1 36,091
    2   2 14,678
    3   3   3.12
    

    > gsub("\\.(.{3})", ",\\1", x)
    [1] "36,091" "14,678" "3.12" 
    

    如果您想更准确一点,请将前瞻或捕获组中的点替换为 \\d,它与数字字符完全匹配。

    gsub("\\.(?=\\d{3})", ",", x, perl=T)
    gsub("\\.(\\d{3})", ",\\1", x)
    

    【讨论】:

    • gsub("\\.(?=\\d{3})", ",", x, perl=T)
    【解决方案2】:

    另一种方法是使用 strsplit ,但看起来很乱:

    gg$Var1<-do.call(rbind,
               lapply(gg$Var1,function(x) 
                        ifelse(
                                nchar(strsplit(x,"\\.")[[1]][2])==3,sub("\\.",",",x),x)))
    
    > gg
      obs   Var1
    1   1 36,091
    2   2 14,678
    3   3   3.12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-07
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2015-10-09
      • 1970-01-01
      相关资源
      最近更新 更多