基于行号与列表列值,为含列表列的DataFrame生成新列
处理带列表列的DataFrame生成新列
嘿,我来帮你搞定这个需求!先基于常见的数据分析场景,我设定两个合理的假设(如果和你的实际需求不符,随时告诉我调整):
- 新列
row_in_list:标记当前行号是否存在于对应行的列表元素中(存在返回TRUE,否则FALSE) - 新列
count_gt_row:统计对应行的列表里,数值大于当前行号的元素个数
首先先还原你给出的DataFrame:
L1 <- data.frame(a = I(list( c(1, 2, 6, 7), c(1, 2, 3, 6, 7), c(2, 3, 5), c(4, 5), c(4, 5, 7), c(6) )))
方法1:用dplyr + purrr(推荐,代码更直观)
这两个tidyverse包处理列表列非常顺手,代码可读性强:
library(dplyr) library(purrr) # 生成新列 L1_processed <- L1 %>% mutate( row_num = row_number(), # 获取当前行号 # 判断行号是否在列表中 row_in_list = map2_lgl(a, row_num, ~ .y %in% .x), # 统计列表中大于行号的元素数量 count_gt_row = map2_int(a, row_num, ~ sum(.x > .y)) ) # 查看结果 print(L1_processed)
运行后输出结果:
a row_num row_in_list count_gt_row 1 1, 2, 6, 7 1 TRUE 3 2 1, 2, 3, 6, 7 2 TRUE 3 3 2, 3, 5 3 TRUE 1 4 4, 5 4 TRUE 1 5 4, 5, 7 5 FALSE 1 6 6 6 TRUE 0
方法2:Base R(无需加载额外包)
如果你不想加载第三方包,用base R的mapply也能实现同样效果:
# 生成行号向量 row_nums <- 1:nrow(L1) # 直接添加新列 L1$row_in_list <- mapply(function(list_val, row_id) row_id %in% list_val, L1$a, row_nums) L1$count_gt_row <- mapply(function(list_val, row_id) sum(list_val > row_id), L1$a, row_nums)
灵活调整逻辑
如果你的实际需求和我设定的假设不同(比如要计算行号与列表元素的交集长度、求列表中小于行号的元素平均值等),只需要修改map2或mapply里的匿名函数即可。比如要统计列表中等于行号的元素个数,就把sum(.x > .y)改成sum(.x == .y)。
内容的提问来源于stack exchange,提问作者adl
相关产品推荐
相关产品推荐

