我有数据框架的暗淡: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中是否有任何库可以帮助我解决这个问题?
答案 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行