将一个数据帧中的元素与包含列表的另一数据帧进行匹配,并在结果中保留第二个数据帧中的行数

问题描述 投票:0回答:1

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

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_2 的第二列使用 df_1[1,1] 和 df_1[2,1] 进行搜索,并沿着 df_2 的第三列使用 df_1[1,2] 和 df_1[2,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])) 

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

A1 假是真的假假假假

A2 假假假假假假

A3 假假假假假假假假假假

A4 假假假假假假假假真假

问题是我想对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 F F F F T F)

我尝试了不同的修改,但无法解决该问题。你们中有人可以帮助我吗?预先感谢。

r dataframe list match
1个回答
0
投票

lapply
嵌套在
mapply
:

m <- mapply(\(i) lapply(df_1[,i], \(x) grepl(x, 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
© www.soinside.com 2019 - 2024. All rights reserved.