在R中按ID分组,基于条件均值计算收入百分比变化
解决方案
你的原代码存在两个核心问题:
- 分组方式错误:
by = .(id, condition)会把每个id+condition组合作为独立分组,无法跨condition获取同一id下的另一条件均值; .I用法错误:.I是返回分组内的行索引,不能用来提取列的具体数值。
优化步骤:
1. 简化conditionIncome列的计算
你之前的fcase是冗余的,因为按id,condition分组后,每个组内的condition值唯一,直接计算均值即可:
dat1[, conditionIncome := mean(income, na.rm = TRUE), by = .(id, condition)]
2. 计算跨条件的百分比变化
我们需要先按id分组,分别获取该id下condition=0和condition=1的收入均值,再计算两者的比例(或变化率),并映射到每一行:
方法一:链式操作(无需中间表)
# 按id分组,计算两个条件的均值,再计算百分比变化 dat1[, c("mean_cond0", "mean_cond1") := .( mean(income[condition == 0], na.rm = TRUE), mean(income[condition == 1], na.rm = TRUE) ), by = id][, incomeChange := (mean_cond1 / mean_cond0) * 100] # 处理只有单个条件的id(避免出现Inf/NA) dat1[, incomeChange := ifelse(is.finite(mean_cond1/mean_cond0), incomeChange, NA)]
方法二:先聚合再合并(更直观)
# 先聚合每个id的两个条件均值 mean_summary <- dat1[, .( mean_cond0 = mean(income[condition == 0], na.rm = TRUE), mean_cond1 = mean(income[condition == 1], na.rm = TRUE) ), by = id] # 合并回原数据集并计算变化 dat1 <- dat1[mean_summary, on = "id"] dat1[, incomeChange := (mean_cond1 / mean_cond0) * 100]
补充说明
- 如果你需要的是百分比变化率(而非比例),可以将计算式改为:
dat1[, incomeChange := ((mean_cond1 - mean_cond0) / mean_cond0) * 100] - 对于只有单个
condition的id(比如示例中的id=3、id=4),计算结果会是NA,可以根据需求替换为其他值(如0)。
内容的提问来源于stack exchange,提问作者painted-skies
相关产品推荐
相关产品推荐

