Select 一组列,每行至少有一个非 NA 条目

Select set of columns so that each row has at least one non-NA entry

我有大量变量(列),但每个变量都缺少一些观察值(行)。如何获得一组(或所有组)列,以便每行至少有一个非 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

这里我想获取列 cd,因为这些组合导致每一行至少有一个非 NA 观察。我想到了暴力破解所有可能的变量组合,但在我的情况下,考虑到大量变量,这是不可行的。有没有更高效的解决方案?

使用 while 循环,这应该可以得到最小的变量集,每行至少有一个 non-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

首先,select 具有最少 NA 的列(存储在 best 中)。然后,使用在剩余行中具有最多 non-NA 行的列更新向量(其中最好的仍然是 NA),直到您获得具有完整案例的每一行。