R按数据框变量分组时生成存储命名向量的列表列的高效方法
解决方案
你之前使用map2生成结果不符合预期的核心原因是:map2是逐元素遍历向量,会对每组内的每一对cty和hwy单独生成长度为1的命名向量,最终每个分组返回了和行数相等的结果,而非每个分组对应一个完整的命名向量。
无需嵌套tibble,直接通过dplyr的分组汇总即可生成目标结果:
library(dplyr) expected_output <- my_mpg %>% group_by(manufacturer, year) %>% summarise( desired_named_vec = list(setNames(cty, hwy)), .groups = "drop" )
该方案没有中间嵌套tibble的冗余步骤,分组汇总时直接将每组的cty作为值、hwy作为名生成命名向量,外层套list()是为了将每个完整的命名向量作为列表的单个元素,存储为列表列;.groups = "drop"参数可以取消结果的分组属性,避免不必要的性能开销。
如果你的数据量达到千万行级,推荐使用性能更高的data.table方案,内存占用和运行速度都优于tidyverse实现:
library(data.table) # 将数据框转换为data.table setDT(my_mpg) expected_output <- my_mpg[, .(desired_named_vec = .(setNames(cty, hwy))), by = .(manufacturer, year) ]
上述代码中by参数指定分组规则,内层的.()是list()的简写,直接将生成的命名向量包装为列表元素,全程无冗余中间对象生成,适合大数据量场景使用。
延伸疑问解答
目前tidyr::nest()默认没有提供直接自定义输出类的参数,设计逻辑上它的定位就是生成嵌套tibble结构。如果你需要自定义嵌套输出类型,可以直接通过分组汇总操作生成目标对象,不需要依赖nest()的默认逻辑,上述直接汇总生成命名向量的方案比修改nest输出的效率更高。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

