将NA替换为data.table的同一列的平均值

时间:2015-09-14 11:47:17

标签: r data.table

我想将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)?

如果这种语法出现问题,可以使用什么方法?

我想要数据表的语法。

6 个答案:

答案 0 :(得分:21)

动物园包中的

na.aggregate将NAs替换为同一列中非NA的平均值:

library(zoo)

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

答案 1 :(得分:9)

虽然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

虽然与动物园相比可能看起来比较大,但它具有高效性,因为所有步骤都是使用按引用更新 :=制作的。 它也可以很容易地调整为使用mean by group替换NA,只需使用data.table中的by参数。

答案 2 :(得分:7)

您的尝试首先对表格进行了子集化,然后选择

> ww[is.na(Sepal.Length)]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1:   

    NA         3.5          1.4         0.2  setosa

所以任何进一步的操作都只能看到&#39;这些行 - 即Sepal.Length只能看到一个NA

您想要的data.table解决方案位于下方 - 它会查看整个表格,并使用NA替换ifelse s。

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

答案 3 :(得分:6)

在基地R:

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

答案 4 :(得分:4)

它不是整个Sepal.Length专栏的平均值;只有您选择的1列。

而是使用:

Could not find member 'Forward'

答案 5 :(得分:3)

tidyr有一个内置函数,replace_na可以用于此:

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