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

基于多分组组合计算分位数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:20:20