You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:58:26