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

R语言中基于单列特征批量重命名变量并分组求和的报错解决与优化需求

解决你的R代码错误并优化实现

首先,咱们来拆解你代码里的几个问题:

  1. 拼写错误:summaries是错的,tidyverse里的分组汇总函数是summarize(或者英式拼写summarise);
  2. 数据类型问题:你的C列是字符型(因为用引号创建的),直接求和会报错,得先转成数值型;
  3. 语法小问题:case_when的最后一个条件后面多了个逗号,虽然R有时候能容忍,但去掉更稳妥;
  4. 需求匹配问题:你要的是C列的求和,而不是计数n(),所以得用sum()而不是n()。

修正后的基础代码

library(dplyr)

# 先重新构造你的数据框
A <- c("NP", "NP", "NP", "NI", "NI", "N1", "NN", "NN", "N1")
B <- c("All M4", "All M4", "All FBS", "C1_D2", "C1D9: PT PI-4, A,B AM1", "C1D9: PT P3,4 B,E A6 ", "W1D5: PRE", "W1D5: PRE", "W1D5: PRE")
C <- c("6","8","3","8","6","9","2","6","5")
df <- data.frame(A, B, C)

# 修正后的核心代码
df2 <- df %>% 
  mutate(
    # 先把C转成数值型,确保求和正常
    C = as.numeric(C),
    # 修正case_when的语法,添加默认值避免NA
    D = case_when(
      startsWith(B, "All") ~ "ALL",
      startsWith(B, "C1_D") ~ "CASE 1 DEAL 2",
      startsWith(B, "C1D9") ~ "CASE 1 DEAL 9",
      startsWith(B, "W1D5") ~ "WELL 1 DEAL 5",
      TRUE ~ "OTHER" # 处理未匹配到的情况,可选
    )
  ) %>% 
  group_by(A, D) %>% 
  summarize(C = sum(C), .groups = "drop") # .groups = "drop"取消分组状态,输出普通数据框

# 查看结果
print(df2)

运行后会得到符合你需求的输出:

# A tibble: 6 × 3
  A     D               C
  <chr> <chr>       <dbl>
1 N1    CASE 1 DEAL 9     9
2 N1    WELL 1 DEAL 5     5
3 NI    CASE 1 DEAL 2     8
4 NI    CASE 1 DEAL 9     6
5 NP    ALL             17
6 NN    WELL 1 DEAL 5     8

更高效的实现方式

如果你的匹配规则固定,还可以用更简洁的方法:

方法1:用forcats::fct_collapse直接合并分组

这个方法适合快速将多个类别合并成目标分组,代码更紧凑:

library(dplyr)
library(forcats)

df2 <- df %>% 
  mutate(
    C = as.numeric(C),
    D = fct_collapse(
      B,
      "ALL" = startsWith(B, "All"),
      "CASE 1 DEAL 2" = startsWith(B, "C1_D"),
      "CASE 1 DEAL 9" = startsWith(B, "C1D9"),
      "WELL 1 DEAL 5" = startsWith(B, "W1D5"),
      other_level = "OTHER"
    ) %>% as.character() # 转成字符型,如果你不需要因子的话
  ) %>% 
  group_by(A, D) %>% 
  summarize(C = sum(C), .groups = "drop")

方法2:用正则表达式匹配(灵活处理复杂规则)

如果后续B列的规则更复杂,用stringr的正则表达式匹配会更灵活:

library(dplyr)
library(stringr)

df2 <- df %>% 
  mutate(
    C = as.numeric(C),
    D = case_when(
      str_detect(B, "^All") ~ "ALL", # ^表示匹配字符串开头
      str_detect(B, "^C1_D") ~ "CASE 1 DEAL 2",
      str_detect(B, "^C1D9") ~ "CASE 1 DEAL 9",
      str_detect(B, "^W1D5") ~ "WELL 1 DEAL 5",
      TRUE ~ "OTHER"
    )
  ) %>% 
  group_by(A, D) %>% 
  summarize(C = sum(C), .groups = "drop")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:12:48