Teilmenge der data.frame-Spalten, um die Anzahl der vollständigen Beobachtungen zu maximieren

Ich habe einen Datenrahmen mit in der Größenordnung von 20 numerischen Spalten, die jeweils signifikante Mengen von NA-Werten enthalten. Ich möchte eine Teilmenge dieser Spalten auswählen, die mir die meisten Zeilen mit Null-NA-Werten liefert. Eine umfassende Suche würde viel Rechenzeit in Anspruch nehmen - gibt es einen besseren Weg, um eine Annäherung zu erhalten?

Hier ist ein Beispiel mit einem kleineren Datenrahmen (völlig willkürlich):

set.seed(2)
foo = as.data.frame(matrix(rnorm(200), nr = 20))
foo[sapply(foo, function(x) x > abs(x[1]))] = NA
foo = foo[-1, ]

round(foo, 3)

       V1     V2     V3     V4     V5     V6     V7     V8     V9    V10
2   0.185 -1.200 -1.959     NA -1.696  0.261  0.139  0.410 -0.638 -1.262
3      NA  1.590 -0.842 -0.703 -0.533 -0.314     NA -0.807 -0.268  0.392
4  -1.130  1.955     NA  0.158 -1.372 -0.750 -0.431  0.086  0.360 -1.131
5  -0.080  0.005     NA  0.506 -2.208 -0.862 -1.044     NA -1.313  0.544
6   0.132 -2.452     NA -0.820     NA     NA  0.538 -0.654 -0.884     NA
7   0.708  0.477 -0.305 -1.999 -0.653  0.940 -0.670     NA     NA  0.025
8  -0.240 -0.597 -0.091 -0.479 -0.285     NA  0.639  0.550 -2.099  0.515
9      NA  0.792 -0.184  0.084 -0.387 -0.421 -1.724 -0.807 -1.239 -0.654
10 -0.139  0.290 -1.199 -0.895  0.387 -0.351 -1.742 -0.997     NA  0.504
11  0.418  0.739 -0.838 -0.921     NA -1.027  0.690     NA     NA -1.272
12     NA  0.319     NA  0.330     NA -0.251  0.331 -0.169     NA -0.077
13 -0.393  1.076 -0.562 -0.142 -1.184  0.472  0.871     NA  0.057 -1.345
14 -1.040 -0.284     NA  0.435 -1.358     NA -2.016 -0.844  0.324 -0.266
15     NA -0.777 -1.048 -0.054 -1.513  0.564  1.213     NA -0.905     NA
16 -2.311 -0.596 -1.966 -0.907 -1.253  0.456  1.200 -1.343 -0.652  0.701
17  0.879 -1.726 -0.323  1.304     NA     NA  1.032     NA -0.262 -0.443
18  0.036 -0.903     NA  0.772  0.008     NA  0.786  0.464 -0.935 -0.789
19     NA -0.559     NA  1.053 -0.843  0.107     NA  0.268     NA -0.857
20  0.432 -0.247     NA -1.410 -0.601 -0.783 -1.454     NA -1.624 -0.746

dim(na.omit(foo))
[1]  1 10

So habe ich eine umfassende Suche formuliert:

best.list = list()
for (i in 5:ncol(foo)) {
    # get best subset for each size
    collist = combn(ncol(foo), i)
    numobs = apply(collist, 2, function(x) nrow(na.omit(foo[, x])))
    cat("for subset size", i, "most complete obs is", max(numobs), "\n")
    best = which(numobs == max(numobs))[1]
    best.list = c(best.list, list(collist[, best]))
}

Zum Beispiel,best.list[[1]] Wenn ich 5 Spalten behalte, kann ich 12 vollständige Beobachtungen machen (Zeilen mit null NAs) und die Spalten 1, 2, 4, 7 und 10 sollten ausgewählt werden.

Während dies für sehr kleine Datenrahmen funktioniert, wird es bei größeren schnell untragbar. Gibt es in R eine Möglichkeit, die beste Teilmenge einer bestimmten Größe effizient zu schätzen? Das einzige, was ich finden konnte, ist dassubselect Paket, obwohl ich nicht herausfinden kann, wie seine Methoden für das vorliegende Problem zu implementieren sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage