如何在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()
代码说明
- 提取Q11数据:通过
filter(Question == 11)筛选出每个案例的总和行 - 区间转换:用
case_when实现多条件判断,严格按照规则将Q11的数值映射为1/2/3 - 调整问题编号:将转换后的行的
Question字段改为12 - 合并排序:把Q12行绑定到原数据集后,按
Case和Question排序,保证数据顺序符合预期
内容的提问来源于stack exchange,提问作者miguel
相关产品推荐
相关产品推荐

