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

在R中合并分类变量生成新变量及均值填充异常问题

我明白你遇到的问题了——你想根据分类变量合并组别,同时用每组的均值填充对应列的缺失值,但现在所有缺失值都被填充成了同一个全局均值,而不是分组后的均值对吧?这大概率是因为你没有正确按照新生成的fac2分组计算均值,导致误用了整个数据集的全局均值来填充所有缺失值。

咱们用你提供的示例数据来演示正确的处理方法,这里我推荐用dplyr包来实现,代码清晰且易维护:

首先,先加载dplyr并定义示例数据:

library(dplyr)

# 你的示例数据
fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1 <- c(NA,2,NA,3,4,5,6,7,NA)
data1 <- data.frame(fac1,x1)

接下来是核心步骤:先生成新的分类变量fac2,再按fac2分组计算均值并填充缺失值:

data_processed <- data1 %>%
  # 第一步:根据规则合并fac1的水平生成fac2
  mutate(fac2 = case_when(
    fac1 %in% c("C", "E") ~ "C-E",
    fac1 %in% c("10", "11", "12") ~ "10-12",
    TRUE ~ fac1  # 其他未指定的类别保持原样
  )) %>%
  # 第二步:按fac2分组,用每组的均值填充该组内的x1缺失值
  group_by(fac2) %>%
  mutate(x1_filled = ifelse(is.na(x1), mean(x1, na.rm = TRUE), x1)) %>%
  ungroup()

查看处理后的结果:

print(data_processed)

输出结果符合你的预期:

fac1 x1   fac2 x1_filled
1    A NA     A       NA
2    B  2     B         2
3    C NA   C-E         3
4    E  3   C-E         3
5    F  4     F         4
6   10  5 10-12         5
7   11  6 10-12         6
8   12  7 10-12         7
9   19 NA    19        NA

为什么之前会出错?

如果你的代码没有使用group_by(fac2)就直接计算mean(x1, na.rm = TRUE),得到的是整个数据集的x1均值(比如你的真实数据里这个值是0.188),然后所有缺失值都会被填充成这个全局值,这就是你看到的异常结果。

额外提示

如果某个fac2分组的x1全是NA(比如示例里的A和19组),mean(x1, na.rm = TRUE)会返回NaN,填充后还是NA。如果需要把这种情况替换成特定值(比如0),可以用coalesce函数调整:

mutate(x1_filled = ifelse(is.na(x1), coalesce(mean(x1, na.rm = TRUE), 0), x1))

如果你习惯用base R,也可以这样实现:

# 定义分组映射
fac_map <- list(
  "C-E" = c("C", "E"),
  "10-12" = c("10", "11", "12")
)

# 生成fac2
data1$fac2 <- data1$fac1
for (new_group in names(fac_map)) {
  data1$fac2[data1$fac1 %in% fac_map[[new_group]]] <- new_group
}

# 计算每组的x1均值
group_means <- tapply(data1$x1, data1$fac2, mean, na.rm = TRUE)

# 填充缺失值
data1$x1_filled <- ifelse(is.na(data1$x1), group_means[data1$fac2], data1$x1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:24