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

时间:2015-03-23 03:37:12

标签: r if-statement replace gsub

我有像

这样的数据
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 {}

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

由于

2 个答案:

答案 0 :(得分:5)

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

> 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

OR

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

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

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

答案 1 :(得分:0)

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