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

如何在R中基于多索引数据汇总值生成分级分类行?

问题

我有一个包含100个案例的数据集,每个案例下有10个问题,每个问题由A、B、C三位评分者打分,原始数据格式如下:

Case Question     A   B       C 
 <dbl>    <dbl> <dbl> <dbl> <dbl> 
     1        1     1   1       0 
     1        2     1   1       1 
     1        3     1   1       0 
     1        4     1   1       1 
     1        5     1   1       1 
     1        6     1   1       1 
     1        7     1   1       1 
     1        8     1   1       1 
     1        9     1   1       0 
     1       10     1   1       0 
     2        1     1   1       1 
     2        2     1   0.5     1 
     ...

我已经借助@Limey提供的函数,为每个案例生成了第11题(Q11),即该案例下1-10题的评分总和,函数代码如下:

addSummaryRow <- function(data, qFilter, newIndex) {
  data %>%
    bind_rows(
      data %>% 
        pivot_longer(cols = c(colnames(df)[3:5])) %>% 
        filter(Question %in% qFilter) %>% 
        group_by(Case, name) %>% 
        summarise(value=sum(value), .groups="drop") %>% 
        pivot_wider(id_cols=c(Case), names_from=name, values_from=value) %>% 
        mutate(Question=newIndex)
    ) %>%
    arrange(Case, Question)
}

df %>% 
  addSummaryRow(1:10, 11)

处理后的数据新增了Q11行,格式如下:

Case Question     A   B       C 
  <dbl>    <dbl> <dbl> <dbl> <dbl> 
   1        1     1   1       0
   1        2     1   1       1
   ...
   1       11    10  10       6
   2        1     1   1       1
   ...
   2       11    10   7.5     8
   ...

现在需要为每个案例添加第12题(Q12),将Q11的数值按以下规则转换:

  • Q11在0-4.0区间时,Q12=1
  • Q11在4.1-7.0区间时,Q12=2
  • Q11在7.1-10区间时,Q12=3

转换后的数据需要新增Q12行,示例如下:

Case Question     A   B       C 
  <dbl>    <dbl> <dbl> <dbl> <dbl> 
   1        1     1   1       0
   ...
   1       11    10  10       6
   1       12     3   3       2
   2        1     1   1       1
   ...
   2       11    10   7.5     8
   2       12     3   3       3
   ...

请问如何在R中实现这个转换并添加行?


解决方案

方法1:直接基于现有数据集扩展

假设你已经通过addSummaryRow得到了包含Q11的数据集(命名为df_with_q11),可以按以下步骤生成Q12行并添加到数据中:

# 先得到包含Q11的数据集
df_with_q11 <- df %>% addSummaryRow(1:10, 11)

# 定义Q11转Q12的规则函数
convert_score <- function(x) {
  case_when(
    x <= 4.0 ~ 1,
    x <= 7.0 ~ 2,
    x <= 10 ~ 3,
    TRUE ~ NA_real_  # 处理超出0-10范围的异常值
  )
}

# 生成Q12行并合并到原数据
df_with_q12 <- df_with_q11 %>%
  bind_rows(
    df_with_q11 %>%
      filter(Question == 11) %>%  # 提取每个案例的Q11行
      mutate(
        across(c(A, B, C), convert_score),  # 对三个评分者的数值做转换
        Question = 12  # 修改问题编号为12
      )
  ) %>%
  arrange(Case, Question)  # 按案例和问题编号排序

方法2:封装为可复用函数

如果后续需要重复使用这个逻辑,可以封装成独立函数:

addQ12Row <- function(data) {
  data %>%
    bind_rows(
      data %>%
        filter(Question == 11) %>%
        mutate(
          A = case_when(A <= 4 ~ 1, A <= 7 ~ 2, A <= 10 ~ 3, TRUE ~ NA),
          B = case_when(B <= 4 ~ 1, B <= 7 ~ 2, B <= 10 ~ 3, TRUE ~ NA),
          C = case_when(C <= 4 ~ 1, C <= 7 ~ 2, C <= 10 ~ 3, TRUE ~ NA),
          Question = 12
        )
    ) %>%
    arrange(Case, Question)
}

# 使用方式
df_with_q12 <- df_with_q11 %>% addQ12Row()

代码说明

  1. 提取Q11数据:通过filter(Question == 11)筛选出每个案例的总和行
  2. 区间转换:用case_when实现多条件判断,严格按照规则将Q11的数值映射为1/2/3
  3. 调整问题编号:将转换后的行的Question字段改为12
  4. 合并排序:把Q12行绑定到原数据集后,按Case和Question排序,保证数据顺序符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:35:23