【问题标题】:Iterate function over data frames in list, find match在列表中的数据帧上迭代函数,找到匹配项
【发布时间】:2021-10-25 08:44:08
【问题描述】:

我正在尝试在与另一个数据框的任何值匹配的数据框列表中查找值。

以下作品:

a <- c(1,2,3,4,5)
b <- list(a = c(9,8,5,7,6),
          b = c(9,5,8,7,6))

lapply(b, function(x) x %in% a)

$a
[1] FALSE FALSE  TRUE FALSE FALSE

$b
[1] FALSE  TRUE FALSE FALSE FALSE

但实际上,列表不是由向量组成,而是由数据帧组成,如下所示:

df1 <- tibble(a = c(111, 222, 333, 444, 555))

df2 <- tibble(a = c(11, 22, 33, 44, 55), 
              b = c(1111, 2222, 3333, 4444, 5555),
              c = c(11111, 2222, 333, 4444, 55555),
              d = c(1, 2, 3, 4, 5))

df3 <- tibble(a = c(11, 22, 33, 44, 55), 
              b = c(11211, 2222, 3333, 4444, 5555),
              c = c(11111, 2222, 333, 4444, 55555),
              d = c(1, 2, 3, 4, 5))

l <- list(df2, df3)

当应用相同的功能时,我得到以下,这绝对不是我想要的:

lapply(l, function(x) x %in% df1$a)

[[1]]
[1] FALSE FALSE FALSE FALSE

[[2]]
[1] FALSE FALSE FALSE FALSE

我猜它不是在每个 tibble 的每一列中的每个值上迭代 df1$a 中的所有值,但为什么不呢? “333”应该在列表中出现两次。我还希望它返回列表中的所有 40 个值,无论是 TRUE 还是 FALSE。没看懂。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用 lapply 2 次​​p>

    lapply(l, function(x) lapply(x, function(y) y %in% df1$a))
    
    [[1]] 
    [[1]]$a [1] FALSE FALSE FALSE FALSE FALSE
    [[1]]$b [1] FALSE FALSE FALSE FALSE FALSE
    [[1]]$c [1] FALSE FALSE  TRUE FALSE FALSE
    [[1]]$d [1] FALSE FALSE FALSE FALSE FALSE
    
    [[2]]
    [[2]]$a [1] FALSE FALSE FALSE FALSE FALSE
    [[2]]$b [1] FALSE FALSE FALSE FALSE FALSE
    [[2]]$c [1] FALSE FALSE  TRUE FALSE FALSE
    [[2]]$d [1] FALSE FALSE FALSE FALSE FALSE
    

    回答下面的评论

    lapply(
      lapply(l, function(x) 
        lapply(x, function(y) y %in% df1$a)),
      as.data.frame)
    

    【讨论】:

    • 是否可以保留列表中小标题的格式?
    • 当然.. 使用第三个lapply ;-) 见上面的编辑..
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多