提问人:Carpa 提问时间:10/18/2023 更新时间:10/18/2023 访问量:50
将一个数据框中的元素匹配到包含列表的其他数据框,并在结果中保留第二个数据框的行数
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
问:
我有两个数据框(其中一个包含列表,每个数据框中都有不同数量的元素):
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)
我尝试了不同的修改,但我无法解决这个问题。你们中有人可以帮我吗?提前致谢。
答:
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
我不明白你怎么能以这种方式连接它们。 并与 的行相关联,但参数是 的列(例如 )。joe
mia
df_2
grepl
x
df_2
unlist(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。也许我再写一个问题。
评论