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
我有这样的数据
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