没有NA的最佳数据子集。

时间:2017-03-17 13:35:31

标签: r algorithm subset na large-data

我有数据框架的暗淡:160560 x 171.有很多数据,但其中近90%是NA。

我愿意使用的算法(让我们称之为ALG)不能容忍data.frame中的任何NA。 我的想法是找到这个data.frame的最佳子集并在其上使用ALG。

当我说子集时,我的想法是什么?具有n列(n <171)data.frame(具有171列)的子集,其不包含任何NA(所有行都已满)。

当我说最好的时候,我的想法是什么?该子集拥有最多的行,它可能具有。 F.E.如果我有两个20列的子集,第一个有1152行,第二个 - 2254,我选择第二个。

问题是简单的组合学在那里不起作用,因为组合的结果(1:171,20)超过5 * 10 ^ 25。

R中是否有任何库可以帮助我解决这个问题?

1 个答案:

答案 0 :(得分:1)

以下是使用crossprod进行此操作的一种方法。这将为您提供给定列数具有最大非NA行数的列。没有解决它,你必须选择一些列。否则,您总是会选择具有最少NA的单个列

首先,让我们为这个例子创建一个初始矩阵。此时它必须是一个矩阵。根据需要对您的数据使用as.matrix

set.seed(2)
x <- runif(150)
x[sample(1:150, 15, replace = FALSE)] <- NA
x <- matrix(x,ncol=10)
round(x,1)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  0.2  0.9  0.0  0.8  0.8  0.8  1.0  0.6  0.0   0.7
 [2,]  0.7  1.0  0.2  1.0  0.9  0.3  0.4  0.9  0.2   0.5
 [3,]  0.6  0.2  0.8  0.3  0.6  0.9  0.4  0.5   NA   0.8
 [4,]  0.2  0.4  0.9  0.5  0.3  0.4  0.6  0.1  0.9   0.2
 [5,]  0.9  0.1  0.5  0.8  0.9  0.6  0.5  0.1  0.2   0.4
 [6,]  0.9  0.7  0.6  0.0  0.4  0.4  0.2  0.0  0.8   0.2
 [7,]   NA  0.4  0.8  0.0  0.4  0.7  0.4  0.7  0.6   0.3
 [8,]  0.8  0.8  0.3  0.7  0.5  0.0  0.1  0.4  0.3   0.6
 [9,]  0.5  0.2  0.7   NA  0.2  0.4  0.1   NA  0.7   0.3
[10,]  0.5   NA  0.2  0.3  0.1  0.2  0.4  0.8  0.3    NA
[11,]  0.6  0.5   NA  0.8  0.3  0.9  0.2  0.8  0.2   0.7
[12,]   NA  0.1   NA  0.8  0.3  1.0  0.4  0.9   NA   0.7
[13,]  0.8   NA  0.1   NA  0.0  0.3  1.0   NA  0.0   0.3
[14,]  0.2  1.0  0.2  0.6  0.2  0.7   NA  1.0   NA   0.5
[15,]  0.4  0.1  0.9  0.7  0.2  0.3  0.3  0.6  0.3   0.3

如您所见,第5列和第6列没有NA

现在,让我们创建一个类似的矩阵,其中NAs为0,非NA为1。

is_na_vector<- ifelse(is.na(x),0,1)

之后,让我们计算crossproduct

crossprod_vector <- crossprod(is_na_vector)
colSums(crossprod_vector)
 [1] 119 120 119 120 135 135 127 120 111 127

如您所见,第5列和第6列的colSums最高。这意味着,与其他变量相结合,它们具有最少数量的NA

然后我们使用该colSums向量来选择多个列。这将对所有列进行排名,并首先给出n。以下是具有最大非NA行数的三列。在这种情况下14行。此时可能存在联系,但选择20列时应该不会出现问题。

n <- 3
x_df <- as.data.frame(x) #to get meaningful colnames
res <- x_df[,rank(-colSums(crossprod_vector),ties.method ="first")<=n ] #use "-" to get decreasing rank
res
          V5        V6        V7
1  0.7700279 0.7554624 0.9767552
2  0.8869842 0.2880597 0.3970164
3  0.6251217 0.8678447 0.3799989
4  0.2603000 0.4026427 0.5603876
5  0.8590731 0.5726850 0.4638082
6  0.4374880 0.3506426 0.1967768
7  0.3881448 0.6719989 0.4269434
8  0.4615011 0.0250504 0.0930252
9  0.2186752 0.4011010 0.1153091
10 0.0659355 0.1999765 0.4400317
11 0.2757010 0.8565250 0.2009347
12 0.3103811 0.9715154 0.4276391
13 0.0421755 0.3237224 0.9806000
14 0.1846735 0.7331914        NA
15 0.1833732 0.3400682 0.2869739

使用na.omit获取非NA行:

na.omit(res)
          V5        V6        V7
1  0.7700279 0.7554624 0.9767552
2  0.8869842 0.2880597 0.3970164
3  0.6251217 0.8678447 0.3799989
4  0.2603000 0.4026427 0.5603876
5  0.8590731 0.5726850 0.4638082
6  0.4374880 0.3506426 0.1967768
7  0.3881448 0.6719989 0.4269434
8  0.4615011 0.0250504 0.0930252
9  0.2186752 0.4011010 0.1153091
10 0.0659355 0.1999765 0.4400317
11 0.2757010 0.8565250 0.2009347
12 0.3103811 0.9715154 0.4276391
13 0.0421755 0.3237224 0.9806000
15 0.1833732 0.3400682 0.2869739

您可以查看使用nrow获得的非NA行数:

nrow(na.omit(res)) #14

对于n <- 5,我得到12个非NA行