基于多分组组合计算分位数的R代码正确性验证
问题
我正在使用R语言,现有如下数据集:
set.seed(123) library(dplyr) var1 = rnorm(10000, 100,100) var2 = rnorm(10000, 100,100) var3 = rnorm(10000, 100,100) var4 = rnorm(10000, 100,100) id = 1:10000 final = data.frame(id, var1, var2, var3, var4) final = final %>% mutate(class1 = case_when(var1 < mean(var1) ~ "A", TRUE ~ "B")) %>% mutate(class2 = case_when(var2 < mean(var2) ~ "C", TRUE ~ "D"))
我需要基于class1和class2的所有唯一组合,对var3和var4计算十分位数,具体要求:
- 对class1=A且class2=C的所有行,计算/分配var3和var4的十分位数
- 对class1=A且class2=D的所有行,计算/分配var3和var4的十分位数
- 对class1=B且class2=C的所有行,计算/分配var3和var4的十分位数
- 对class1=B且class2=D的所有行,计算/分配var3和var4的十分位数
我编写了如下R代码,请问这段代码是否正确?
final = final %>% group_by(class1, class2) %>% mutate(class3 = case_when(ntile(var3, 10) == 1 ~ "one", ntile(var3, 10) == 2 ~ "two", ntile(var3, 10) == 3 ~ "three", ntile(var3, 10) == 4 ~ "four", ntile(var3, 10) == 5 ~ "five", ntile(var3, 10) == 6 ~ "six", ntile(var3, 10) == 7 ~ "seven", ntile(var3, 10) == 8 ~ "eight", ntile(var3, 10) == 9 ~ "nine", ntile(var3, 10) == 10 ~ "ten")) %>% mutate(class4 = case_when(ntile(var4, 10) == 1 ~ "one", ntile(var4, 10) == 2 ~ "two", ntile(var4, 10) == 3 ~ "three", ntile(var4, 10) == 4 ~ "four", ntile(var4, 10) == 5 ~ "five", ntile(var4, 10) == 6 ~ "six", ntile(var4, 10) == 7 ~ "seven", ntile(var4, 10) == 8 ~ "eight", ntile(var4, 10) == 9 ~ "nine", ntile(var4, 10) == 10 ~ "ten"))
解答
你的代码是正确的。
正确性说明
通过group_by(class1, class2)按两个分类变量的组合分组后,ntile(var3, 10)和ntile(var4, 10)会在每个分组内独立计算十分位数,完全匹配你按4种class1+class2组合分别计算的需求。后续的case_when语句也正确将数字形式的十分位数转换为对应的英文单词标签,逻辑无错误。
代码优化建议
原代码可以简化,避免重复调用ntile和冗长的case_when结构,优化后更简洁易读:
# 定义十分位数对应的英文标签 decile_labels = c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten") final = final %>% group_by(class1, class2) %>% mutate( class3 = decile_labels[ntile(var3, 10)], class4 = decile_labels[ntile(var4, 10)] ) %>% ungroup() # 可选:若后续无需保留分组状态,建议取消分组
这段优化代码和原代码功能完全一致,但减少了重复代码和计算冗余。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

