2015-07-22 4 views
0

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

Это функция, которую мне нужно применить, и я проверил ее с помощью цикла 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 ... но Я не работаю. Не могу найти ничего, чтобы опираться на, интернет-серфинг ..

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

+0

'применяются (ДФ, 2, функция (х) среднее (сортировка (x, убывающий = F) [1: 5])) ' – mts

ответ

3

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

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 
+0

Спасибо, очень приятное объяснение.Я не понял второго аргумента, и я думаю, что это было для меня больше неприятностей. – arodrisa

2

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

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 
+0

спасибо, я решил это так – arodrisa

1

Попробуйте использовать применяются:

a<-apply(table,2,function(x){mean(head(sort(x),5))}) 
4

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

colMeans(head(apply(m, 2, sort),5)) 
Смежные вопросы