如何在list-column中应用dplyr函数?附报错示例与代码
在嵌套数据框(List-Column)中正确使用dplyr函数的解决方案
我来帮你搞定这个嵌套数据框的汇总问题!先拆解下你遇到的错误原因,再给你两种实用的解决方法。
错误原因分析
你碰到的两个报错,核心都是处理list-column时没有正确指定操作对象:
- 第一个错误
Can't convert a list to function:直接在summarise_if里用.data会让R混淆对象类型,.data在这里并非可调用的函数。 - 第二个错误
no applicable method for 'tbl_vars' applied to an object of class 'rlang_data_pronoun':在map的公式语法里,.data的作用域不对,你需要用.x来指代map迭代的每个子数据框元素。
另外,当前tidyverse已经推荐用across()替代summarise_if()这类旧的scoped动词,所以我们用更现代的写法来解决问题。
完整解决方案代码
从你的原始代码出发,加上正确的汇总步骤:
library(tidyverse) # 生成数据集并完成聚类(加set.seed保证结果可复现) set.seed(123) dataset <- as_tibble(matrix(rnorm(6*30,1000,100),ncol=6)) cluster <- kmeans(dataset, centers=3) dataset$kmeans <- as.factor(cluster[['cluster']]) # 生成嵌套数据框(你的代码到这里是正确的) obj <- dataset %>% group_by(kmeans) %>% nest() # 方法1:保留嵌套结构,添加汇总后的子数据列 obj_with_summary <- obj %>% mutate(cluster_sum = map(data, ~ .x %>% summarise(across(where(is.numeric), sum)))) # 查看嵌套的结果 print(obj_with_summary) # 方法2:展开嵌套,直接得到每行对应一个聚类的汇总表 cluster_summary <- obj %>% mutate(cluster_sum = map(data, ~ .x %>% summarise(across(where(is.numeric), sum)))) %>% unnest(cluster_sum) # 查看展开后的汇总结果 print(cluster_summary)
代码解释
map(data, ~ .x %>% ...):map会遍历data列(list-column)里的每个子数据框,.x就是当前迭代的子数据框对象。summarise(across(where(is.numeric), sum)):用across指定要操作的列(所有数值型列),然后应用sum函数做汇总,这是当前dplyr的标准写法。unnest(cluster_sum):把嵌套的汇总数据列展开成常规表格形式,方便查看和后续分析。
这样就能顺利完成每个聚类组的数值列汇总啦!
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

