【问题标题】:Delete rows with grep() and lapply with data.table [duplicate]使用 grep() 删除行并使用 data.table 删除行 [重复]
【发布时间】:2017-08-11 22:45:15
【问题描述】:

我正在学习数据表的工作原理,并尝试在两列(id1id2)上使用 grep() 来删除不返回 TRUE 的行。

我知道我必须使用函数lapply(),但它总是返回以下错误:

argument 'pattern' has length > 1 and only the first element will be used

我试过了(我知道这是错误的):

DT[, lapply(.SD, grepl(id1, id2)), by= id]

我正在处理的数据:

structure(list(id = c(52L, 52L, 52L, 52L, 54L, 54L, 84L, 84L, 
87L, 87L, 129L, 129L, 130L, 130L, 130L), id1 = c("8113H187", 
"3505H6", "3505H6", "3505H6", "3505H6", "3505H6", "3505H6", "3505H6", 
"8113H187", "8113H187", "3505H6", "3505H6", "3505H6", "3505H6", 
"3505H6"), id2 = c("3505H6856", "3505H6856", "3505H6856", "3505H6856", 
"3505H67158", "3505H67158", "3505H63188", "3505H63188", "3505H64691", 
"3505H64691", "3505H664133", "3505H664133", "3505H658134", "3505H658134", 
"3505H658134")), .Names = c("id", "id1", "id2"), row.names = c(NA, 
-15L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000064f0788>)

【问题讨论】:

  • grepl 模式参数未矢量化。试试library(stringi) ; DT[, stri_detect_fixed(id2, id1)]

标签: r data.table lapply


【解决方案1】:

我们可以使用Map来比较'id1'中对应的元素pattern和'ID2'中的元素

DT[unlist(Map(grepl, id1, id2))]

【讨论】:

    【解决方案2】:
    DT[mapply( grepl, id1, id2), ]
    
    #     id    id1         id2
    # 1:  52 3505H6   3505H6856
    # 2:  52 3505H6   3505H6856
    # 3:  52 3505H6   3505H6856
    # 4:  54 3505H6  3505H67158
    # 5:  54 3505H6  3505H67158
    # 6:  84 3505H6  3505H63188
    # 7:  84 3505H6  3505H63188
    # 8: 129 3505H6 3505H664133
    # 9: 129 3505H6 3505H664133
    # 10: 130 3505H6 3505H658134
    # 11: 130 3505H6 3505H658134
    # 12: 130 3505H6 3505H658134
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 2023-02-02
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多