将一个数据框中的元素匹配到包含列表的其他数据框,并在结果中保留第二个数据框的行数

Matching elements from one data frame to other data frame containing lists and keeping in the results the number of rows from the second data frame

提问人:Carpa 提问时间:10/18/2023 更新时间:10/18/2023 访问量:50

问:

我有两个数据框(其中一个包含列表,每个数据框中都有不同数量的元素):

df_1 <- as.data.frame(matrix(c(2, 5, 6, 7), 2, 2))

list_1 <- list(list('joe'), list('mia'), list(1,2,3), list(1,3), list(2,5,4,8), list(4,5,7,8))

df_2  <-  as.data.frame(matrix(list_1, 2, 3))

我想用 df_1[1,1] 和 df_1[2,1] 沿着df_2的第二列,用 df_1[1,2] 和 df_1[2,2] 沿着df_2的第三列搜索,如下所示:

A1 <- grepl(df_1[1,1],unlist(df_2[,2])) 
A2 <- grepl(df_1[2,1],unlist(df_2[,2])) 
A3 <- grepl(df_1[1,2],unlist(df_2[,3])) 
A4 <- grepl(df_1[2,2],unlist(df_2[,3])) 

(在这种情况下,如果我不使用“取消列出”,它效果很好,但在我的实际数据框中,它只有在取消列出第二个数据框的列时才有效(好吧,但不是真的)。结果如下:

答1 假 真 假 假 假

答2 假 假 假

答3 假 假

答4 假 假

问题是我想用 A1、A2、A3 和 A4 做一个 cbind,所以它们的最终长度应该是 2,正好是df_2的行数。最终期望的结果是一个 2x2(测试了 2 行df_2和 2 列)数据帧,如下所示:

(F T F F F)(F F F F F)

(F F F F F)(F F F F F F T F)

我尝试了不同的修改,但我无法解决这个问题。你们中有人可以帮我吗?提前致谢。

R 数据帧 列表 匹配

评论


答:

1赞 jblood94 10/18/2023 #1

lapply嵌套在 :mapply

m <- mapply(\(i) lapply(df_1[,i], grepl, unlist(df_2[,i + 1])), 1:2)

m
#>      [,1]      [,2]     
#> [1,] logical,5 logical,8
#> [2,] logical,5 logical,8
c(m)
#> [[1]]
#> [1] FALSE  TRUE FALSE FALSE FALSE
#> 
#> [[2]]
#> [1] FALSE FALSE FALSE FALSE FALSE
#> 
#> [[3]]
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> 
#> [[4]]
#> [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE

评论

0赞 Carpa 10/19/2023
非常感谢您的帮助!我有一个附加问题:如何将“m”与“joe”和“mia”的结果联系起来?在本例中,A1 和 A3 来自“joe”,A2 和 A4 来自“mia”。我的 df 非常大,我得到了非常奇怪的结果。
0赞 jblood94 10/19/2023
我不明白你怎么能以这种方式连接它们。 并与 的相关联,但参数是 的(例如 )。joemiadf_2greplxdf_2unlist(df_2[,2])
0赞 Carpa 10/20/2023
在我们的例子中,Ind1 (df_1[1,], 2 和 6 与 joe 和 mina (df_2 进行比较;第1栏为“2”,第2栏为“6”。Ind2(在我们的例子中为df_1[2,],5和7)以相同的方式进行比较。在那之后,我想看看有多少 TRUE 对 joe(在我们的例子中为 1)和 mia(0)获得 ind1;与 ind2 相同,0 T 对 joe,1 对 mia。它用于识别目的。无论如何,非常感谢您的帮助@jblood94。也许我再写一个问题。