我有大量變數(列),但每個變數都有一些觀察值(行)的缺失值。如何獲得一組(或所有組)列,以便每一行至少有一個非 NA 值?
例子:
> df <- data.frame(a=c(1,NA,NA,1,NA), b=c(NA,1,NA,1,NA), c=c(1,NA,NA,NA,1), d=c(1,1,1,1,NA))
> df
a b c d
1 1 NA 1 1
2 NA 1 NA 1
3 NA NA NA 1
4 1 1 NA 1
5 NA NA 1 NA
在這里,我想獲得列c和d,因為這些組合導致每行至少有一個非 NA 觀察。我想過暴力破解所有可能的變陣列合,但考慮到大量變數,在我的情況下這是不可行的。有沒有更有效的解決方案?
uj5u.com熱心網友回復:
使用while回圈,這應該可以得到最少的變數集,每行至少有一個非 NA。
best <- function(df){
best <- which.max(colSums(sapply(df, complete.cases)))
while(any(rowSums(sapply(df[best], complete.cases)) == 0)){
best <- c(best, which.max(sapply(df[is.na(df[best]), ], \(x) sum(complete.cases(x)))))
}
best
}
測驗
best(df)
#d c
#4 3
df[best(df)]
# d c
#1 1 1
#2 1 NA
#3 1 NA
#4 1 NA
#5 NA 1
首先,選擇 NA 最少的列(存盤在 中best)。然后,用剩余行上非 NA 行數最多的列更新向量(其中最好的仍然是 NA),直到獲得具有完整案例的每一行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468524.html
上一篇:如何將字典串列轉換為表格
下一篇:如何進行自定義分組依據?
