如何用%>%管道结合split函数将R的DataFrame转为分组列表?
在R中用管道将DataFrame转为分组列表
先回顾你的原始数据和目标:
df <- data.frame(var1=c("A","A","A","B","B","C"),var2=seq(1,6))
目标是得到和split(df$var2, df$var1)完全一致的分组列表,下面是几种用%>%管道实现的方法:
方法1:基础R split + 管道(用大括号调整参数)
%>%默认会把左侧数据框作为右侧函数的第一个参数,直接写df %>% split(.$var1)会拆分整个数据框,而非var2列。用大括号可以打破这个默认逻辑,手动指定split的两个参数:
library(magrittr) # 若已加载tidyverse则无需单独加载 df %>% {split(.$var2, .$var1)}
运行结果:
$A [1] 1 2 3 $B [1] 4 5 $C [1] 6
方法2:dplyr + deframe(符合tidyverse风格)
用分组汇总把每组的var2转为列表,再用deframe把分组变量转为列表名称:
library(dplyr) df %>% group_by(var1) %>% summarise(data = list(var2)) %>% tibble::deframe()
该方法输出和split完全一致,且更贴合tidyverse的操作习惯。
方法3:dplyr group_map + 命名
用group_map提取每组的var2列,再手动给列表命名:
library(dplyr) df %>% group_by(var1) %>% group_map(~ .x$var2) %>% setNames(unique(df$var1))
内容的提问来源于stack exchange,提问作者Massimo2013
相关产品推荐
相关产品推荐

