2017-06-01 38 views
1

我試圖用所有這些列的平均值替換幾列中的NA值。平均值假設按行計算。用行mutate_at替換NA表示

我試過這個代碼,但在NAS不被替換:

ID Price1 Price2 Price3 Price4 
1 2.1 3  4  NA 
2 2  3  4.5 NA 
3 2  NA  4  NA 
4 NA  3  4  NA 

price_cols <- c("Price1", "Price2", "Price3", "Price4") 
data %>% 
    mutate_at(price_cols, funs(if_else(is.na(.), mean(price_cols, na.rm = TRUE), as.double(.)))) 

我也嘗試添加了行()的管道鏈,但仍然一無所獲。我知道這與代碼沒有真正考慮跨行的意思有關,但我不知道如何改變它,所以它確實如此。幫幫我!

回答

2

is.na(df)rowMeans使用arr.ind -parameter的which在一起,你可以在基礎R做到這一點相當easlity:

i <- which(is.na(df), arr.ind = TRUE) 
df[i] <- rowMeans(df[,-1], na.rm = TRUE)[i[,1]] 

這給:

> df 
    ID Price1 Price2 Price3 Price4 
1 1 2.1  3 4.0 3.033333 
2 2 2.0  3 4.5 3.166667 
3 3 2.0  3 4.0 3.000000 
4 4 3.5  3 4.0 3.500000 

這是幹什麼的:

隨着which(is.na(df), arr.ind = TRUE)你得到的行數和列數的數組索引,其中有一個NA - 值:

> which(is.na(df), arr.ind = TRUE) 
    row col 
[1,] 4 2 
[2,] 3 3 
[3,] 1 5 
[4,] 2 5 
[5,] 3 5 
[6,] 4 5 

隨着rowMeans(df[,-1], na.rm = TRUE)你由行得到的裝置的矢量:

> rowMeans(df[,-1], na.rm = TRUE) 
[1] 3.033333 3.166667 3.000000 3.500000 

通過索引與數組索引的行列,你得到矢量,只要NA - 值在數據幀的數量:

> rowMeans(df[,-1], na.rm = TRUE)[i[,1]] 
[1] 3.500000 3.000000 3.033333 3.166667 3.000000 3.500000 

通過與數組索引的索引數據框df ,你告訴R在哪些位置放置這些值。

+0

謝謝,這工作!我也看到這個問題已經被問到了,但我找不到它,因爲我專注於dpyr解決方案。 – GreenManXY

+0

@GreenManXY很高興我能幫到你。 'dplyr'專注於解決特定的任務。 * tidyverse *可以看作是R的附加組件;沒有更多,沒有更多。對基本R函數有廣泛的瞭解可以確實有用;-) – Jaap