这是我之前problem的扩展。
我稍微更改了数据集。
dat2 <- read.table(header=TRUE, text="
ID De Ep Ti ID1
A1123 A117 121 100 11231
A1123Zmcd A108 C207 D110 E11232
A1124MDN A122cd C207 D110 E11232
A1124MDN A117mnm C207cd D110 E11232
A1124fex A122cdc C208 D110 E11232
B1125MD A108vbd C208 D110 E11232
B1125klmc A10cde8 C208 D110 E11232
B1126true A122 C208 D110 E11233
C1126mlk A109bvc C208cd D111 E11233
")
dat2
ID De Ep Ti ID1
1 A1123 A117 121 100 11231
2 A1123Zmcd A108 C207 D110 E11232
3 A1124MDN A122cd C207 D110 E11232
4 A1124MDN A117mnm C207cd D110 E11232
5 A1124fex A122cdc C208 D110 E11232
6 B1125MD A108vbd C208 D110 E11232
7 B1125klmc A10cde8 C208 D110 E11232
8 B1126true A122 C208 D110 E11233
9 C1126mlk A109bvc C208cd D111 E11233
我的匹配字符串文件如下:
dat3 <- read.table(header=TRUE, text="
ID1
mc
MDN
md
true
cd
vb
MAKE
MODEL
")
dat3
ID1
1 mc
2 MDN
3 md
4 true
5 cd
6 vb
7 MAKE
8 MODEL
使用grep
从上一个解决方案中,我可以通过特定字符串获取文件。
dat2[grep(dat3[1, ],dat2$ID),]
ID De Ep Ti ID1
2 A1123Zmcd A108 C207 D110 E11232
7 B1125klmc A10cde8 C208 D110 E11232
我希望数据框与dat3
中任意前三列中dat2
中的所有字符串匹配,如下所示。
ID De Ep Ti ID1
A1123Zmcd A108 C207 D110 E11232
A1124MDN A122cd C207 D110 E11232
A1124MDN A117mnm C207cd D110 E11232
A1124fex A122cdc C208 D110 E11232
B1125MD A108vbd C208 D110 E11232
B1125klmc A10cde8 C208 D110 E11232
B1126true A122 C208 D110 E11233
C1126mlk A109bvc C208cd D111 E11233
答案 0 :(得分:2)
我们可以使用lapply
遍历'dat2'列,将'dat3'列折叠为|
分隔的单个字符串,在pattern
中将其用作grepl
},生成的list
个逻辑向量可以折叠成一个带有Reduce
的向量,并将其用作行索引来对'dat2'进行子集化。
dat2[Reduce(`|`,lapply(dat2, function(x) grepl(paste(dat3[[1]], collapse='|'), x))),]
# ID De Ep Ti ID1
#2 A1123Zmcd A108 C207 D110 E11232
#3 A1124MDN A122cd C207 D110 E11232
#4 A1124MDN A117mnm C207cd D110 E11232
#5 A1124fex A122cdc C208 D110 E11232
#6 B1125MD A108vbd C208 D110 E11232
#7 B1125klmc A10cde8 C208 D110 E11232
#8 B1126true A122 C208 D110 E11233
#9 C1126mlk A109bvc C208cd D111 E11233