如何在R数据框中创建包含多列条目列表的新列?
解决方法
你的错误在于list(fastballs, sliders, curves)是把整个列作为列表的元素,生成了一个包含3个元素的列表,但数据框只有2行,mutate要求新列长度必须匹配行数(2)或为1,因此报错。
下面是几种可行的解决方案:
方案1:按行分组后打包
通过rowwise()让代码按行执行,每行将三个列的数值打包成一个列表:
library(tidyverse) df <- data.frame(name = c('Bob','AJ'), fastballs = c(20,13), sliders = c(40,13), curves = c(14,0)) %>% rowwise() %>% mutate(list_column = list(c(fastballs, sliders, curves))) %>% ungroup() # 取消行分组,避免影响后续操作
方案2:使用pmap函数
pmap可以对每行的多列值批量应用函数,这里用c把每行的三个值组合成向量:
library(tidyverse) df <- data.frame(name = c('Bob','AJ'), fastballs = c(20,13), sliders = c(40,13), curves = c(14,0)) %>% mutate(list_column = pmap(list(fastballs, sliders, curves), c))
方案3:批量选择列打包
如果需要处理的列是连续的(比如第2到第4列),可以用c_across批量选择列,不用逐个写列名:
library(tidyverse) df <- data.frame(name = c('Bob','AJ'), fastballs = c(20,13), sliders = c(40,13), curves = c(14,0)) %>% rowwise() %>% mutate(list_column = list(c_across(fastballs:curves))) %>% ungroup()
执行任意一种方案后,查看df$list_column就能得到预期结果:第一行为c(20,40,14),第二行为c(13,13,0)。
内容的提问来源于stack exchange,提问作者Violin125
相关产品推荐
相关产品推荐

