我有一個NAS上的數據幀,我想與行替換港定居意味着查找和行替換缺失值意味着
c1 = c(1,2,3,NA)
c2 = c(3,1,NA,3)
c3 = c(2,1,3,1)
df = data.frame(c1,c2,c3)
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 NA 3
4 NA 3 1
使
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
我有一個NAS上的數據幀,我想與行替換港定居意味着查找和行替換缺失值意味着
c1 = c(1,2,3,NA)
c2 = c(3,1,NA,3)
c3 = c(2,1,3,1)
df = data.frame(c1,c2,c3)
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 NA 3
4 NA 3 1
使
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
非常相似@巴蒂斯特的回答
> ind <- which(is.na(df), arr.ind=TRUE)
> df[ind] <- rowMeans(df, na.rm = TRUE)[ind[,1]]
我的解決辦法是
rwmns = rowMeans(df,na.rm=TRUE)
df$c1[is.na(df$c1)] = rwmns[is.na(df$c1)]
df$c2[is.na(df$c2)] = rwmns[is.na(df$c2)]
df$c3[is.na(df$c3)] = rwmns[is.na(df$c3)]
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
有沒有更優雅的方式,特別是當有人有很多列時?
偉大的工作來了自己的解決方案之後。你可以使用'[['來代替索引,所以每一行變成'df [[col_name]] [is.na(df [[col_name]])] < - rwmns [is.na(df [[col_name]]) '。這樣,您可以循環或使用應用系列來覆蓋要執行替換的列名稱。 – Justin
我想這樣的作品,
df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE)
+1不錯的解決方案!比我懶惰的「申請」好多了! –
使用is.na和complete.cases有點多餘;在兩條線上可能會有更多更有效的方式 – baptiste
也許這樣? 'idx < - which(is.na(df),arr.ind = TRUE); df [idx] < - rowMeans(df [idx [,1],],na.rm = TRUE)' –
使用apply
(注意,返回的對象是一個matrix
):
t(apply(df , 1 , function(x) { x[ is.na(x) ] = mean(x , na.rm = TRUE); x }))
c1 c2 c3
[1,] 1 3 2
[2,] 2 1 1
[3,] 3 3 3
[4,] 2 3 1
我們使用任何匿名函數來改變各行中的每個NA
的值到該行的mean
。唯一的優點是,如果行數增加,則不必再進行打字。從計算的角度來看,它不是特別有效或快速,但在認知意義上更是如此(除非你擁有100萬行),否則你不會注意到。
另一種選擇是從library(zoo)
na.aggregate
調換數據集
library(zoo)
df[] <- t(na.aggregate(t(df)))
df
# c1 c2 c3
#1 1 3 2
#2 2 1 1
#3 3 3 3
#4 2 3 1
+1良好的使用經常忽略的'arr.ind'參數 –
我發現如果我有整行NA,就會發生錯誤。將這作爲一個全新的問題是否適當的禮節? – Brian