Использование применения в R

У меня есть числовая матрица, и я хочу получить среднее значение 5 самых низких (наименьших значений) элементов из каждого столбца. Я пытаюсь использовать одну из различных доступных функций применения. Но я не могу этого сделать.

Это функция, которую мне нужно применить, и я проверил ее с помощью цикла for и отлично работает.

   mean(head(sort(table[,x]),5))

Это один из нескольких примеров, которые я пытался:

   a<-mapply(function(x){mean(head(sort(table[,x]),5))},table)

Я получаю следующую ошибку:

   Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) :   undefined columns selected 

Я также пробовал sapply, lapply... но у меня не получилось. Не могу найти ничего, на чем можно было бы основываться, роется в инете..

заранее спасибо


person arodrisa    schedule 22.07.2015    source источник


Ответы (4)


Ваша самая простая догадка - применить здесь, так как вы хотите применить столбец. С некоторыми примерными данными:

set.seed(123)
df = matrix(rnorm(100), 10, 10)

это будет работать:

apply(df, 2, function(x) mean(sort(x, decreasing = F)[1:5]))

Что делает этот код?

  • первый аргумент, который нужно применить, - это данные, здесь df (вы называете это table в своем вопросе).
  • второй аргумент 2 указывает, что функция применяется к каждому столбцу. Также есть 1 для строк и c(1,2) для обоих.
  • третий аргумент - ваша функция. Поскольку это нетривиально, рекомендуется определить его на месте, т. е. вы определяете функцию x (где представьте x как один столбец вашего фрейма данных/матрицы), а затем берете mean первых 5 элементов ( индексация [1:5]) из sort. Вы также видите, как вы можете передавать дальнейшие аргументы функциям (например, decreasing = FALSE, что, по общему признанию, здесь является поведением по умолчанию, но, скажем, вам нужно среднее из 5 самых высоких значений). Если у вас отсутствуют данные, вы можете добавить na.rm = TRUE в качестве аргумента к mean.

Вот ваш вывод:

> apply(df, 2, function(x) mean(sort(x, decreasing = F)[1:5]))
 [1] -0.6376458 -0.5049506 -1.1295099 -0.1233905 -0.7905504 -0.3444174 -0.5745786 -1.0836254 -0.1159064 -0.4503110
person mts    schedule 22.07.2015
comment
Спасибо, сэр, очень хорошее объяснение. Я не понял второго аргумента, и я думаю, что именно он доставлял мне больше хлопот. - person arodrisa; 22.07.2015

Вы ищете colMeans, делая код более компактным:

colMeans(head(apply(m, 2, sort),5))
person Colonel Beauvel    schedule 22.07.2015

Попробуй это:

set.seed(1)
(mat <- matrix(sample(1:12, 12), ncol = 3))
#      [,1] [,2] [,3]
# [1,]    4    2    3
# [2,]    5    7    1
# [3,]    6   10   11
# [4,]    9   12    8
n <- 2
apply(mat, 2, function(x) mean(head(sort(x), n)))
# [1] 4.5 4.5 2.0
person lukeA    schedule 22.07.2015

Попробуйте применить:

a<-apply(table,2,function(x){mean(head(sort(x),5))})
person Joswin K J    schedule 22.07.2015