【发布时间】:2018-12-13 21:47:57
【问题描述】:
我在选择前 n% 的最大和最小元素时遇到问题 从每个数据矩阵行。具体来说,我想找到那些前 n% 元素的列号。如果每行具有相同数量的非 NA 元素,这将不是问题,但在这种情况下,每行选取的元素数量不同。这是一个例子(实际数据矩阵是 195x1030,所以我不会在这里使用它),其中前 40% 被选中
data=
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 NA 100 98 200 78 80 35 NA 55
[2,] 32 67 15 73 NA 12 91 230 3 99
[3,] NA NA NA 45 53 26 112 64 80 41
[4,] 54 38 60 70 163 69 109 205 5 31
[5,] 107 28 296 254 30 40 NA 18 28 90
生成的前 40% 列数矩阵应如下所示(拾取元素的数量是通过向下舍入计算的,就像函数 as.integer 所做的那样)
largest= smallest=
[,1] [,2] [,3] [,4] [,1] [,2] [,3] [,4]
[1,] 5 3 4 NA [1,] 1 8 10 NA
[2,] 8 10 7 NA [2,] 9 6 3 NA
[3,] 7 9 NA NA [3,] 6 10 NA NA
[4,] 8 5 7 4 [4,] 9 10 2 1
[5,] 3 4 1 10 [5,] 8 9 2 5
因此,仅查看行的非 NA 元素来选择顶部数字。例如,数据矩阵的第一行仅包含 8 个非 NA 数,因此选择了 40%*8=3,2~3 个元素。这会为结果矩阵创建 NA。
我再次尝试使用 for 循环(这段代码是为了找到最大的 40%):
largest <- matrix(rep(NA, 20), nrow = 5)
for(i in 1:5){
largest[i,]<-order(data[i,], decreasing=T)
[1:as.integer(0.4*nrow(data[complete.cases(data[,i]),]))]
}
但是R返回一个错误:“要替换的项目数不是替换长度的倍数”,我认为这意味着由于不是原始最大矩阵的所有元素在循环时都没有被替换,所以这个for循环不能使用。我说的对吗?
这种拣货怎么做?
【问题讨论】:
-
我(还)不明白您的预期输出。在
largest中,为什么元素是[1,4] = NA而不是7?第 7 列包含data第 1 行中的第四大数字。对于元素[2,4]类似,对于其他NA条目以此类推。 -
这是因为我只想选择前 40% 的非 NA 元素。例如对于包含 8 个非 NA 元素的第一行,选取的元素数为 0,4*8=3,2。这四舍五入为 3。因此,最大矩阵的第一行应该只包含 3 个数字,而不是 4。我会指定问题,谢谢您的评论。
-
您是否需要对顶部/底部 n% 进行排序,或者顶部/底部 n% 的位置是否足够?如果是这样,我会准备好解决方案。
-
没想到,其实我不需要排序!只是位置就足够了。
-
太慢了 :) @MauritsEvers 帮你搞定了。