将聚合方法中的值转换为 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
列并赋值可能是错误的方法,因为
- 'GENDER' 分组的顺序可能与原始数据中的顺序不同
- 每个 '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
我试图用基于性别列的列的平均值填充列 '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
列并赋值可能是错误的方法,因为
- 'GENDER' 分组的顺序可能与原始数据中的顺序不同
- 每个 '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