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

use*_*020 15 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
Run Code Online (Sandbox Code Playgroud)

为什么我应该用NaN代替NA,它应该是其余值的平均值(4.9,4.7,4.6,5.0)?

如果这种语法有问题,那么实现这一点的替代方法是什么?

我想要数据表的语法.

G. *_*eck 21

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

library(zoo)

ww[, Sepal.Length := na.aggregate(Sepal.Length)]
Run Code Online (Sandbox Code Playgroud)


jan*_*cki 11

虽然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
Run Code Online (Sandbox Code Playgroud)

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


Akh*_*air 7

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

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

    NA         3.5          1.4         0.2  setosa
Run Code Online (Sandbox Code Playgroud)

所以任何进一步的操作只能"看到"这些行 - 即Sepal.Length只能看到那一行NA.

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

ww[, Sepal.Length := ifelse(is.na(Sepal.Length), mean(Sepal.Length, na.rm = TRUE), Sepal.Length)]
Run Code Online (Sandbox Code Playgroud)

  • 或者`ww [,Sepal.Length:= replace(Sepal.Length,is.na(Sepal.Length),mean(Sepal.Length,na.rm = TRUE))]`因为`ifelse`通常很慢.令人讨厌的是,"Sepal.Length"需要在这里输入四次. (2认同)

phi*_*ver 6

在基地R:

ww$Sepal.Length[is.na(ww$Sepal.Length)] <- mean(ww$Sepal.Length, na.rm = T)
Run Code Online (Sandbox Code Playgroud)

  • 你可以将这种语法转换为data.table的语法吗? (4认同)