我有类似的数据

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)

08-19 09:39