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

JOS*_*DEZ 3 replace if-statement r gsub

我有像这样的数据

obs  Var1   
1    36.091  
2    14.678  
3    3.12
Run Code Online (Sandbox Code Playgroud)

我的问题是,我想更换"."一个","gsub(),但不是所有的意见,只是有3个字符的点右边的意见(".").在这种情况下,观察1和2.

我想的是:

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

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

谢谢

Avi*_*Raj 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
Run Code Online (Sandbox Code Playgroud)

要么

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

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

gsub("\\.(?=\\d{3})", ",", x, perl=T)
gsub("\\.(\\d{3})", ",\\1", x)
Run Code Online (Sandbox Code Playgroud)

  • 或`gsub("\\.(?= \\ d {3})",",",x,perl = T)` (2认同)