2015-11-02 32 views
1

这是我以前的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 

我想要得到的数据帧中dat2像下面匹配dat3目前所有字符串中的任何前三列。

  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 

回答

2

我们可以通过的“DAT2”使用lapply列环,折叠“DAT3”列到由|分隔单个串,用其作为patterngrepl,所得逻辑矢量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 
+2

这正是我要发布的内容:)也许它是'lapply'内的'dat2 [,1:3]'。 – nicola

相关问题