【问题标题】:Subset data from a list of Strings字符串列表中的子集数据
【发布时间】:2015-11-02 16:11:08
【问题描述】:

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

【问题讨论】:

    标签: r string


    【解决方案1】:

    我们可以使用lapply 遍历'dat2' 的列,将'dat3' 列折叠成由| 分隔的单个字符串,将其用作grepl 中的pattern,得到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
    

    【讨论】:

    • 这正是我要发布的内容 :) 也许是 dat2[,1:3]lapply 内。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2020-02-29
    • 1970-01-01
    • 2019-03-09
    • 2019-11-08
    • 2012-07-18
    • 2020-06-01
    • 2018-01-02
    相关资源
    最近更新 更多