在R中的整个data.frame中查找带有新值的子字符串/替换全字符串

时间:2015-12-08 12:51:24

标签: regex r dataframe grepl

我有一个包含许多列的大型数据框。对于这些列的子集,我想在子字符串上匹配并替换

两列子集的示例如下:

df <- data.frame(list(A=c("0/0:52,0:52:High_Confidence:99:0","0/0:2,0:2:Low_Confidence:3:0,3,45,1858","0/0:52,0:52:High_Confidence:99:0,135,1858","0/0:9,0:9:Low_coverage_High_quality:21:0,21,291"), B=c("0/0:5,0:5:Low_Confidence:15:0,15,194","0/0:21,0:21:High_Confidence:51:0,51,675","0/0:1,0:1:Low_Confidence:3:0,3,39","0/0:17,0:17:High_Confidence:48:0,48,609")))

我想使用grepl类型命令用./替换带有“Low_Confidence”的字段。跨越整个数据框架。

我试过了:

df[grepl(".*Low_Confidence.*", df)] <- "./." # replaces ALL values with ./.
df[agrep(".*Low_Confidence.*", df)] <- "./." # Does nothing

df[grep(".*Low_Confidence.*", df)] <- "./." 
df[grep("Low_Confidence", df)] <- "./."

其中大多数返回带有./的相关列中所有值的data.frames。无论它们是否符合Low_Confidence标准。

我也尝试将data.frame转换为矩阵

df  <- as.matrix(df)
df[df==".*Low_Confidence.*"]  <- "./." # does nothing

没有成功。我知道如果我一次只做一列,可能是这样的,例如:

df$V85[grepl(".*Low_Confidence.*", df$V85)] <- "./."

但对于高重复性的100列。

所以我正在寻找一种解决方案,它将使用通配符匹配整个字符串(而不仅仅是匹配的文本),以匹配所有或列的子集中的data.frame(两者都可以)。

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,将列转换为字符(需要执行此步骤,因为您提供的数据框包含因子。以这种方式替换因子的值会导致NAs),然后用&#34; ./.&# 34替换Low_Confidence单元格。使用申请:

df1 <- apply(df,2,as.character)
df1[apply(df1,2,function(x) grepl("Low_Confidence",x))] <- "./."