在 R 中的数字数据框中使用函数 na_ma
Using function na_ma in a numeric dataframe in R
我正在尝试使用 library(imputeTS)
中的函数 na_ma
;因为我正在通过用周围值的平均值替换它们来处理数据框中的缺失值。
数据示例:
i1<-c(5,4,3,4,5)
i2<-c(2,NA,4,5,3)
i3<-c(NA,4,4,4,5)
i4<-c(3,5,5,NA,2)
data<-as.data.frame(cbind(i1,i2,i3,i4))
data
我的代码
data %>%
rowwise %>%
na_ma(as.numeric(x), k = 1, weighting = "simple")
预期结果:
i1 i2 i3 i4
1 5 2 2.5 3
2 4 4 4 5
3 3 4 4 5
4 4 5 4 4.5
5 5 3 5 2
问题,我不知道如何将 na_ma(as.numeric(x), k = 1, weighting = "simple")
应用于此数据框的每一行。
谢谢!
如果您想使用 tidyverse
来执行此操作,您可以使用 pmap_df
。
library(dplyr)
library(purrr)
data %>%
pmap_df(~imputeTS::na_ma(c(...), k = 1, weighting = "simple"))
# i1 i2 i3 i4
# <dbl> <dbl> <dbl> <dbl>
#1 5 2 2.5 3
#2 4 4 4 5
#3 3 4 4 5
#4 4 5 4 4.5
#5 5 3 5 2
这也可以在 base R 中完成 -
data[] <- t(apply(data, 1, imputeTS::na_ma, k = 1, weighting = "simple"))
您确定要这样做吗?通常我们用列的平均值估算 列。
cm <- colMeans(dat, na.rm=TRUE)
dat <- Map(\(x, y) ifelse(is.na(x), y, x), data, cm) |>
as.data.frame()
dat
# i1 i2 i3 i4
# 1 5 2.0 4.25 3.00
# 2 4 3.5 4.00 5.00
# 3 3 4.0 4.00 5.00
# 4 4 5.0 4.00 3.75
# 5 5 3.0 5.00 2.00
实际上,最好使用更复杂的插补技术,例如多重插补。 Here a reading.
数据
dat <- structure(list(i1 = c(5, 4, 3, 4, 5), i2 = c(2, NA, 4, 5, 3),
i3 = c(NA, 4, 4, 4, 5), i4 = c(3, 5, 5, NA, 2)), class = "data.frame", row.names = c(NA,
-5L))
我正在尝试使用 library(imputeTS)
中的函数 na_ma
;因为我正在通过用周围值的平均值替换它们来处理数据框中的缺失值。
数据示例:
i1<-c(5,4,3,4,5)
i2<-c(2,NA,4,5,3)
i3<-c(NA,4,4,4,5)
i4<-c(3,5,5,NA,2)
data<-as.data.frame(cbind(i1,i2,i3,i4))
data
我的代码
data %>%
rowwise %>%
na_ma(as.numeric(x), k = 1, weighting = "simple")
预期结果:
i1 i2 i3 i4
1 5 2 2.5 3
2 4 4 4 5
3 3 4 4 5
4 4 5 4 4.5
5 5 3 5 2
问题,我不知道如何将 na_ma(as.numeric(x), k = 1, weighting = "simple")
应用于此数据框的每一行。
谢谢!
如果您想使用 tidyverse
来执行此操作,您可以使用 pmap_df
。
library(dplyr)
library(purrr)
data %>%
pmap_df(~imputeTS::na_ma(c(...), k = 1, weighting = "simple"))
# i1 i2 i3 i4
# <dbl> <dbl> <dbl> <dbl>
#1 5 2 2.5 3
#2 4 4 4 5
#3 3 4 4 5
#4 4 5 4 4.5
#5 5 3 5 2
这也可以在 base R 中完成 -
data[] <- t(apply(data, 1, imputeTS::na_ma, k = 1, weighting = "simple"))
您确定要这样做吗?通常我们用列的平均值估算 列。
cm <- colMeans(dat, na.rm=TRUE)
dat <- Map(\(x, y) ifelse(is.na(x), y, x), data, cm) |>
as.data.frame()
dat
# i1 i2 i3 i4
# 1 5 2.0 4.25 3.00
# 2 4 3.5 4.00 5.00
# 3 3 4.0 4.00 5.00
# 4 4 5.0 4.00 3.75
# 5 5 3.0 5.00 2.00
实际上,最好使用更复杂的插补技术,例如多重插补。 Here a reading.
数据
dat <- structure(list(i1 = c(5, 4, 3, 4, 5), i2 = c(2, NA, 4, 5, 3),
i3 = c(NA, 4, 4, 4, 5), i4 = c(3, 5, 5, NA, 2)), class = "data.frame", row.names = c(NA,
-5L))