R, gsub(), 替换“.”对于 "," 给定一些条件

R, gsub(), replace "." for "," given some conditions

我有这样的数据

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 {}

我不知道这是否是正确的方法,但我没有想出其他方法。

谢谢

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

> 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)

另一种方法是使用 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