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

R使用dplyr的mutate/summarise报错、百分比计算及时间列排序问题

错误原因及修复方案

1. invalid 'type' (closure)报错根源

你在计算S06Proportions时调用的是原始数据集S06,但count列是你之前统计到S06Behav数据集里的字段,原始数据S06中不存在count这个变量,R会默认调用base包中的count()函数(属于closure类型的函数对象)进行求和,自然会报类型无效错误。

2. 百分比计算错误原因

你的分组逻辑不符合占比计算需求:你将PredictedBehaviorFull也放入了summarise的分组维度中,导致每个分组仅包含1行数据,sum(n)的结果和n完全相等,计算出的percentage永远为1,无法得到正确的行为占比。你需要调整分组规则:按Time和Context分组,在此分组内计算不同PredictedBehaviorFull的占比。

3. Time列顺序混乱解决方法

Time列目前是字符串格式,R默认按字典序排序,会出现“1 10”排在“1 2”前面的错位问题。你需要将Time列转换为有序因子,按照实际时间先后指定层级顺序即可固定排序。


修正后的完整代码

library(dplyr)
library(ggplot2)
library(tidyr)

# 1. 统计每个分组的行为计数
S06Behav <- S06 %>%
  group_by(Time, PredictedBehaviorFull, Context) %>%
  summarise(count = n(), .groups = "drop")

# 2. 计算正确的行为占比
S06Proportions <- S06Behav  %>%
  # 仅按时间和场景分组,在此分组内计算不同行为的占比
  group_by(Time, Context) %>%
  mutate(percentage = count / sum(count)) %>%
  ungroup()

# 3. 修复Time列排序:提取时间数值,按天+小时排序,转成有序因子
time_order <- S06Proportions %>%
  distinct(Time) %>%
  separate(Time, into = c("day", "hour"), sep = " ", convert = TRUE) %>%
  arrange(day, hour) %>%
  pull(Time)
S06Proportions$Time <- factor(S06Proportions$Time, levels = time_order, ordered = TRUE)

# 导出结果
write.csv(S06Proportions, "S06Proportions.csv", row.names = FALSE)

# 4. 修复后的堆叠条形图代码
ggplot(
  S06Proportions,
  aes(
    fill = PredictedBehaviorFull,
    y = percentage,
    x = Time
  )) +
  geom_bar(
    position = "fill", stat = "identity") +
  facet_wrap(~ Context) +
  theme(axis.text.x = element_text(size = 8, angle = 66, hjust = 1)) +
  labs(x = "Time", y = "Percentage")

内容的提问来源于stack exchange,提问作者Sharklady

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:36:02