【问题标题】:apply regexp in one data frame based on the column in another data frame根据另一个数据框中的列在一个数据框中应用正则表达式
【发布时间】:2019-02-21 16:21:41
【问题描述】:

我有两个数据框 --- 表 A 是模式表,表 B 是名称表。我想对表 B 进行子集化,它与表 a 中的模式匹配。

A <- data.frame(pattern = c("aa", "bb", "cc", "dd"))
B <- data.frame(name = "aa1", "bb1", "abc", "def" ,"ddd")

我正在尝试做一个 for 循环,看起来像:

for (i in 1:nrow(A)){
for (j in 1:nrow(B)){
DT <- data.frame(grep(A$pattern[i], B$name[j], ignore.case = T, value = T))
}}

我希望我的结果表 DTto 仅包含 aa1bb1ddd

但它超级慢。我只是想知道是否有更有效的方法来做到这一点?非常感谢!

【问题讨论】:

    标签: r for-loop apply lapply


    【解决方案1】:

    不需要双循环,下面只使用sapply循环。

    inx <- unlist(sapply(A$pattern, grep, B$name))
    B[inx, , drop = FALSE]
    #  name
    #1  aa1
    #2  bb1
    #5  ddd
    

    【讨论】:

      【解决方案2】:

      您的示例输入数据中似乎有一个小错误(缺少 B$name 未正确声明,需要为两个 data.frame 对象包含 stringsAsFactors = F):

      > A <- data.frame(pattern = c("aa", "bb", "cc", "dd"), stringsAsFactors = F)
      > B <- data.frame(name = c("aa1", "bb1", "abc", "def" ,"ddd"), stringsAsFactors = F)
      

      代码

      # using sapply with grepl
      > indices <- sapply(1:nrow(A), function(z) grepl(A$pattern[z], B$name[z]))
      > indices
      [1]  TRUE  TRUE FALSE FALSE
      
      > B[indices, ]
      [1] "aa1" "bb1" "ddd"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多