gpt4 book ai didi

r - 没有 NA 的 data.frame 的最佳可能子集

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:07 24 4
gpt4 key购买 nike

我有 dim 的 data.frame:160560 x 171。有很多数据,但几乎 90% 都是 NA。

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

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

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

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

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

最佳答案

这是使用 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

现在,让我们创建一个类似的矩阵,其中 NA 为 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 行

关于r - 没有 NA 的 data.frame 的最佳可能子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42858959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com