r语言 - 将NAs替换为数据表中同一列的平均值



我想用同一列的平均值替换DATA TABLE中列中存在的NAs。我正在做以下事情。

ww <- data.table(iris)
ww <- ww[1:5 , ]
ww[1,1] <- NA
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:           NA         3.5          1.4         0.2  setosa
2:          4.9         3.0          1.4         0.2  setosa
3:          4.7         3.2          1.3         0.2  setosa
4:          4.6         3.1          1.5         0.2  setosa
5:          5.0         3.6          1.4         0.2  setosa

ww[is.na(Sepal.Length) , Sepal.Length:= mean(Sepal.Length, na.rm = T)]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:          NaN         3.5          1.4         0.2  setosa
2:          4.9         3.0          1.4         0.2  setosa
3:          4.7         3.2          1.3         0.2  setosa
4:          4.6         3.1          1.5         0.2  setosa
5:          5.0         3.6          1.4         0.2  setosa

为什么我得到NaN而不是NA,而它应该是其余值(4.9,4.7,4.6,5.0)的平均值?

如果这个语法有问题,实现这个的替代方法是什么?

我想知道数据表的语法

zoo包中的na.aggregate用同一列中非NAs的平均值替换NAs:

library(zoo)
ww[, Sepal.Length := na.aggregate(Sepal.Length)]

虽然zoo的答案很好,但它需要新的依赖项。
仅使用data.table,您可以执行以下操作:

library(data.table)
# prepare data
ww = data.table(iris[1:5,])
ww[1, Sepal.Length := NA]
# solution
ww[, Sepal.Length.mean := mean(Sepal.Length, na.rm = TRUE) # calculate mean
   ][is.na(Sepal.Length), Sepal.Length := Sepal.Length.mean # replace NA with mean
     ][, Sepal.Length.mean := NULL # remove mean col
       ][] # just prints

虽然它可能看起来比动物园的大,但它的性能效率很高,因为所有步骤都是使用通过引用 :=进行更新的。它也可以很容易地将NA替换为mean by group,只需在data.table中使用by参数。

您的尝试首先对表进行子集设置,选择

> ww[is.na(Sepal.Length)]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:   
    NA         3.5          1.4         0.2  setosa

因此任何进一步的操作只能'看到'这些行-即Sepal.Length只能看到NA

您想要的data.table解决方案如下-它查看整个表,并用使用ifelse的方法替换NA

ww[, Sepal.Length := ifelse(is.na(Sepal.Length), mean(Sepal.Length, na.rm = TRUE), Sepal.Length)]

In base R:

ww$Sepal.Length[is.na(ww$Sepal.Length)] <- mean(ww$Sepal.Length, na.rm = T)

它不是取整个萼片的平均值。长度列;只有您选择的1列。

,而使用:

ww[is.na(Sepal.Length) , Sepal.Length:= mean(ww$Sepal.Length, na.rm=TRUE)]

tidyr有一个内置的功能,replace_na可以用于此:

library(tidyr)
ww %>% replace_na(list(Sepal.Length = mean(.$Sepal.Length, na.rm = TRUE)))

最新更新