删除字符串中的运行长度重复数字和 NA

标签 r regex duplicates

我有包含大串十进制数字和 NA 的列:

df <- data.frame(
  A_gsr =c("2.752,2.752,2.752,2.752,2.752,2.752,2.752,2.911,2.911,3.555",
           "2.999,2.999,2.999,2.752,2.752,2.752,2.752"),
  B_gsr = c("1.34,1.34,1.34,1.55,1.55,1.55,1.55,1.55,1.55,1.55",
            "1.56,1.56,1.56,1.55,1.55,1.55,1.55,NA,NA,NA,NA,1.34,1.34,1.34"),
  C_gsr = c("NA,NA,NA,0.147,0.147,0.147,0.147,0.147,NA",
            "0.146,0.146,0.146,0.146,0.146,0.146,0.146,0.146,0.146,0.146")
)

我想删除所有游程重复项。使用 gsub 和反向引用,我已经非常接近我想要的了:

lapply(df[,1:3], function(x) gsub("((\\d\\.\\d+,)|(NA,))\\1+", "\\1", x))
$A_gsr
[1] "2.752,2.911,3.555" "2.999,2.752,2.752"

$B_gsr
[1] "1.34,1.55,1.55"         "1.56,1.55,NA,1.34,1.34"

$C_gsr
[1] "NA,0.147,NA" "0.146,0.146"

但是,还不够接近 - 仍然有一些游程重复,都在字符串的末尾。 预期的结果是这样的:

$A_gsr
[1] "2.752,2.911,3.555" "2.999,2.752"

$B_gsr
[1] "1.34,1.55"         "1.56,1.55,NA,1.34"

$C_gsr
[1] "NA,0.147,NA" "0.146"

最佳答案

你可以使用

lapply(df[,1:3], function(x) gsub("\\b(\\d+\\.\\d+|NA)(?:,\\1)+\\b", "\\1", x))
## => $A_gsr
##   [1] "2.752,2.911,3.555" "2.999,2.752"      
##   
##   $B_gsr
##   [1] "1.34,1.55"         "1.56,1.55,NA,1.34"
##   
##   $C_gsr
##   [1] "NA,0.147,NA" "0.146"    

参见 regex demoR demo online .

详细信息:

  • \b - 单词边界
  • (\d+\.\d+|NA) - 第 1 组:一位或多位数字,.,一位或多位数字,或 NA字符串
  • (?:,\1)+ - 一个或多个逗号和第 1 组中的值的重复
  • \b - 单词边界

关于删除字符串中的运行长度重复数字和 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66800487/

相关文章:

r - 如何根据经纬度列表从栅格堆栈中提取数据?

r - 在列表上使用 purrr 在不同的列上进行变异

java - 模式名称特殊字符

php - array_unique 对于简单数组不一致

mysql - SQL 按姓氏对具有重复元组的表进行分组

r - FUN(X[[i]],...) 中的错误 : only defined on a data frame with all numeric variables

regex - 使用 XSD 中的正则表达式验证 XML 中的 JSON

Python正则表达式检测字母之间的下划线

java - 插入前检查

r - 子集数据框,其中日期在 R 中日期向量的 x 天内