r 用常量替换缺失值,列名遵循通用模式
r replace missing values with a constant and column name follow a common pattern
我的数据集有这样的列和值。列名都以一个共同的字符串开头,Col_a_**
ID Col_a_01 Col_a_02 Col_a_03
1 1 2 1
2 1 NA 0
3 NA 0 2
4 1 0 1
5 0 0 2
我的目标是用该列的众数替换缺失值。
预期的数据集是这样的
ID Col_a_01 Col_a_02 Col_a_03
1 1 2 1
2 1 0** 0
3 1** 0 2
4 1 0 1
5 0 0 2
第一列中的 NA 替换为 1,因为第一列的众数为 1。第二列中的 NA 替换为 0,因为第二列的众数为 0。
我可以像下面这样做
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
df$Col_a_01[is.na(Col_a_01)==TRUE] <- getmode(df$Col_a_01)
df$Col_a_03[is.na(Col_a_02)==TRUE] <- getmode(df$Col_a_02)
df$Col_a_03[is.na(Col_a_03)==TRUE] <- getmode(df$Col_a_03)
但是,如果我有 100 列以相似的名称开头并以 1,2,3..100 结尾,这将变得笨拙。我很好奇是否有更简单、更优雅的方法来实现这一点。提前致谢。
您可以使用 ifelse
/replace
更改 NA
值,要将函数应用于多个列,请使用 dplyr
中的 across
。
library(dplyr)
df <- df %>%
mutate(across(starts_with('Col_a'), ~replace(., is.na(.), getmode(.))))
在基础 R 中,使用 lapply
-
cols <- grep('Col_a', names(df))
df[cols] <- lapply(df[cols], function(x) replace(x, is.na(x), getmode(x)))
我们可以使用 na.aggregate
并将 FUN
指定为 getmode
library(zoo)
library(dplyr)
df1 <- df1 %>%
mutate(across(starts_with('Col_a'), na.aggregate, FUN = getmode))
-输出
df1
ID Col_a_01 Col_a_02 Col_a_03
1 1 1 2 1
2 2 1 0 0
3 3 1 0 2
4 4 1 0 1
5 5 0 0 2
或者可以简单地
na.aggregate(df1, FUN = getmode)
ID Col_a_01 Col_a_02 Col_a_03
1 1 1 2 1
2 2 1 0 0
3 3 1 0 2
4 4 1 0 1
5 5 0 0 2
我的数据集有这样的列和值。列名都以一个共同的字符串开头,Col_a_**
ID Col_a_01 Col_a_02 Col_a_03
1 1 2 1
2 1 NA 0
3 NA 0 2
4 1 0 1
5 0 0 2
我的目标是用该列的众数替换缺失值。
预期的数据集是这样的
ID Col_a_01 Col_a_02 Col_a_03
1 1 2 1
2 1 0** 0
3 1** 0 2
4 1 0 1
5 0 0 2
第一列中的 NA 替换为 1,因为第一列的众数为 1。第二列中的 NA 替换为 0,因为第二列的众数为 0。
我可以像下面这样做
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
df$Col_a_01[is.na(Col_a_01)==TRUE] <- getmode(df$Col_a_01)
df$Col_a_03[is.na(Col_a_02)==TRUE] <- getmode(df$Col_a_02)
df$Col_a_03[is.na(Col_a_03)==TRUE] <- getmode(df$Col_a_03)
但是,如果我有 100 列以相似的名称开头并以 1,2,3..100 结尾,这将变得笨拙。我很好奇是否有更简单、更优雅的方法来实现这一点。提前致谢。
您可以使用 ifelse
/replace
更改 NA
值,要将函数应用于多个列,请使用 dplyr
中的 across
。
library(dplyr)
df <- df %>%
mutate(across(starts_with('Col_a'), ~replace(., is.na(.), getmode(.))))
在基础 R 中,使用 lapply
-
cols <- grep('Col_a', names(df))
df[cols] <- lapply(df[cols], function(x) replace(x, is.na(x), getmode(x)))
我们可以使用 na.aggregate
并将 FUN
指定为 getmode
library(zoo)
library(dplyr)
df1 <- df1 %>%
mutate(across(starts_with('Col_a'), na.aggregate, FUN = getmode))
-输出
df1
ID Col_a_01 Col_a_02 Col_a_03
1 1 1 2 1
2 2 1 0 0
3 3 1 0 2
4 4 1 0 1
5 5 0 0 2
或者可以简单地
na.aggregate(df1, FUN = getmode)
ID Col_a_01 Col_a_02 Col_a_03
1 1 1 2 1
2 2 1 0 0
3 3 1 0 2
4 4 1 0 1
5 5 0 0 2