将与字符串列表不匹配的单元格替换为 NA 仅适用于 R 中的某些列

Replace cells not matched a list of string to NA for only for certain cols in R

我有一个包含多个列的数据框"abnormal2",我以剪切一些列为例;

   id class1 class2 class3 class4 class5
1   1 PATH   PATH   PATH   PATH   PATH
2   2 rLS          PATH     LB   <NA>
3   3 PATH   PATH   PATH   <NA>   <NA>
4   4 PATH    VUS    VUS   <NA>   <NA>
5   5 PATH    VUS    VUS   <NA>   <NA>
6   6 PATH   PATH    VUS   PATH   <NA>
7   7 MPATH    VUS    VUS   <NA>   <NA>
8   8 VUS    VUS    VUS   <NA>   <NA>
9   9 PATH    VUS    VUS   <NA>   <NA>
10  10 PATH   PATH          <NA>   <NA>

我想要的是将与字符串列表 (MPATH,VUS_LPATH,VUS_LB,PATH,VUS,LB,Normal) 不匹配的任何单元格替换为 NA。这是仅针对从 class1 到 class5 的列的替换; 结果可能是这样的:

   id class1 class2 class3 class4 class5
1   1 PATH   PATH   PATH   PATH   PATH
2   2 NA    NA      PATH     LB   <NA>
3   3 PATH   PATH   PATH   <NA>   <NA>
4   4 PATH    VUS    VUS   <NA>   <NA>
5   5 PATH    VUS    VUS   <NA>   <NA>
6   6 PATH   PATH    VUS   PATH   <NA>
7   7 MPATH    VUS    VUS   <NA>   <NA>
8   8 VUS    VUS    VUS   <NA>   <NA>
9   9 PATH    VUS    VUS   <NA>   <NA>
10  10 PATH   PATH    NA     <NA>   <NA>

我使用了下面的代码,但它不起作用:

sel <- grepl("class",names(abnormal2))
abnormal2[sel] <- data.frame(lapply(abnormal2[sel], function(x) gsub([^MPATH|^VUS\_LPATH|^VUS\_LB|^PATH|^VUS|^LB|^Normal]","", x)))

如果您的字符串匹配是准确的(而不是要求正则表达式),那么以您的想法为基础,下面的方法将起作用。

sel <- grepl("class",names(abnormal2))

matches <- c("MPATH", "VUS_LPATH", "VUS_LB", "PATH", "VUS", "LB", "Normal")

abnormal2[sel] <- data.frame(lapply(abnormal2[sel], function(x) {
   x[!x %in% matches] <- NA
   x
}), stringsAsFactors = F)