R语言:匹配含列表的数据框元素并保留目标数据框行数
问题描述
我有两个数据框,其中一个的列包含不同元素数量的列表:
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]))
(注:本例不使用unlist也能运行,但实际数据必须用unlist才能执行,不过效果仍不理想)
当前得到的结果是长度不一致的逻辑向量:
A1: FALSE TRUE FALSE FALSE FALSE A2: FALSE FALSE FALSE FALSE FALSE A3: FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE A4: FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
我需要将这些结果整理成一个2×2的数据框(对应df_2的2行和2组匹配项),每个单元格保留对应匹配的逻辑向量,期望结构如下:
(FALSE TRUE FALSE) (FALSE FALSE FALSE FALSE) (FALSE FALSE) (FALSE FALSE TRUE FALSE)
解决方案
核心思路是针对df_2每一行的列表元素,逐个匹配df_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)) # 定义匹配函数:检查列表中每个元素是否等于目标值 match_target <- function(target, lst) { sapply(lst, function(x) x == target) } # 生成2×2的结果数据框 result_df <- data.frame( # 第一列:匹配df_1的第1列与df_2的第2列 group1 = list( match_target(df_1[1, 1], df_2[1, 2][[1]]), match_target(df_1[2, 1], df_2[2, 2][[1]]) ), # 第二列:匹配df_1的第2列与df_2的第3列 group2 = list( match_target(df_1[1, 2], df_2[1, 3][[1]]), match_target(df_1[2, 2], df_2[2, 3][[1]]) ) ) # 查看结果 print(result_df)
运行后输出的result_df即为期望的结构:
group1 group2 1 FALSE, TRUE, FALSE FALSE, FALSE, FALSE, FALSE 2 FALSE, FALSE FALSE, FALSE, TRUE, FALSE
内容的提问来源于stack exchange,提问作者Carpa
相关产品推荐
相关产品推荐

