使用mapply为数据框添加嵌套列时遇输出大小错误的原因及解决
错误原因与解决办法
错误原因
mapply默认会把函数返回的多个向量扁平化拼接成一个长向量。你的代码里每个x:(x+y-1)返回8个元素,4行就生成了4*8=8个元素的向量,但数据框只有4行,mutate要求新列的长度必须和数据框行数一致(4)或者是可循环的长度(1),因此触发报错。
你提到在更大数据框能运行,大概率是那个数据框里每行返回的序列长度不一致,mapply遇到长度不同的结果时,会自动返回列表而非扁平化向量,刚好符合嵌套列的要求;但这次每行返回的序列长度都是8,mapply就默认扁平化处理了。
解决办法
方法1:给
mapply添加SIMPLIFY=FALSE参数
强制mapply返回列表,每个元素对应行的序列,匹配数据框行数:df %>% mutate(Hour = mapply(function(x, y) x:(x + y - 1), Start, Length, SIMPLIFY = FALSE))方法2:使用
purrr包的map2函数(tidyverse风格)map2专门处理两个输入的逐行映射,默认返回列表,适合生成嵌套列:library(purrr) df %>% mutate(Hour = map2(Start, Length, ~.x:(.x + .y - 1)))方法3:
rowwise配合list()包装
先按行分组,用list()把每行的序列包装成列表元素:df %>% rowwise() %>% mutate(Hour = list(Start:(Start + Length - 1))) %>% ungroup()
内容的提问来源于stack exchange,提问作者Elis
相关产品推荐
相关产品推荐

