使用R/dplyr按条件将dataframe转换为指定命名列表的实现方法
基于tidyverse的解决方案
你可以直接用purrr::map遍历除Person外的所有列实现需求,代码非常简洁:
library(tidyverse) # 核心转换代码 result_list <- df %>% # 仅保留需要遍历的指标列 select(-Person) %>% # 对每一列,提取值为1对应的Person姓名 map(~ df$Person[.x == 1])
如果你更倾向于先做长表转换的显式逻辑写法,也可以用如下方案:
result_list <- df %>% # 转换为长表,把所有指标列收拢为行 pivot_longer(cols = -Person, names_to = "col_name", values_to = "value") %>% # 筛选值为1的行 filter(value == 1) %>% # 按原列名分组 group_by(col_name) %>% # 每组的Person姓名合并为列表 summarise(person_list = list(Person)) %>% # 直接转换为命名列表,列名作为列表键,姓名向量作为列表值 deframe()
效果验证
你可以用示例数据测试运行效果:
# 构造示例输入df df <- tibble( Person = c("John", "James", "Keith", "Boris"), a = c(1,0,1,0), b = c(0,1,0,1), c = c(1,1,0,0), d = c(1,0,0,0) ) # 运行转换代码后查看结果 print(result_list)
输出完全符合你给出的预期结构。
内容的提问来源于stack exchange,提问作者Daniil Khlebnikov
相关产品推荐
相关产品推荐

