簡體   English   中英

將NA替換為data.table的同一列的平均值

[英]Replace NAs with mean of the same column of a 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)?

如果這種語法有問題,那么實現這一點的替代方法是什么?

我想要數據表的語法。

動物園包中的na.aggregatena.aggregate替換為同一列中非NA的平均值:

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

雖然與動物園相比看起來可能看起來很大,但它具有高效性,因為所有步驟都是通過引用更新來實現的 := 它也可以很容易地調整為使用mean by group替換NA,只需使用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 s。

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

在基地R:

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

它沒有采用整個Sepal.Length列的平均值; 只有您選擇的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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM