在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
相关产品推荐
相关产品推荐

