将聚合方法中的值转换为 R 中其他列条件的 NA 值

Get values from aggregate method into NA values from other column condition in R

我试图用基于性别列的列的平均值填充列 'Income' 中的 NA 值,因此如果 'M' 有一个 NA 值,请从所有的平均值中插入一个'M' 人(NA 值除外):

    GENDER|INCOME
         M|     1
         M|     2
         M|     3
         M|    NA
         F|     4
         F|     4
         F|     5
         F|    NA


    GENDER|INCOME
         M|     1
         M|     2
         M|     3
         M|     2
         F|     4
         F|     4
         F|     5
         F|  4.33

我尝试了聚合方法,但它给了你一个列表,如果我尝试输入我的数据集,它会给我一个错误,以便我编写 CSV。它非常适合获取值,但我不知道如何手动输入这些值。 到目前为止,这是我的代码:

df$INCOME[is.na(df$INCOME)] <- aggregate(.~df$GENDER, df, FUN = mean, na.rm = TRUE)

感谢您的帮助!

如果我们希望 mean 为每个 'GENDER' 填充缺失值 (NA),则使用 zoo 中的 na.aggregate 来执行此操作自动(FUN 默认为 mean

library(zoo)
library(dplyr)
df <- df %>% 
  group_by(GENDER) %>% 
  mutate(INCOME = na.aggregate(INCOME)) %>%
  ungroup

或者另一种选择是 replace NA 元素与 mean

df %>%
   group_by(GENDER) %>%
   mutate(INCOME = replace(INCOME, is.na(INCOME), 
        mean(INCOME, na.rm = TRUE))) %>%
 ungroup

aggregate returns 汇总值列和组列的 data.frame。因此,在 NA 元素上分配整个 data.frame 可能不起作用,即我们需要提取列

df_mean <- aggregate(INCOME ~ GENDER, df, FUN = mean,
   na.rm = TRUE, na.action = NULL)
df_mean
   GENDER   INCOME
1      F 4.333333
2      M 2.000000
df_mean$INCOME
[1] 4.333333 2.000000
df$INCOME[is.na(df$INCOME)] <- df_mean$INCOME

提取 INCOME 列并赋值可能是错误的方法,因为

  1. 'GENDER' 分组的顺序可能与原始数据中的顺序不同
  2. 每个 'GENDER' 的 NA 数量可能不同

因此,一个选项也是merge汇总数据,然后根据NA元素更改值

transform(merge(df, df_mean, by = "GENDER"), 
   INCOME = ifelse(is.na(INCOME.x), INCOME.y, INCOME.x))[c('GENDER', 'INCOME')]
  GENDER   INCOME
1      F 4.000000
2      F 4.000000
3      F 5.000000
4      F 4.333333
5      M 1.000000
6      M 2.000000
7      M 3.000000
8      M 2.000000