У меня проблема с выбором 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 не может быть использован. Я прав?
Как можно было сделать такой выбор?