2014-11-28 3 views
0

У меня есть матрица:условно сбросив столбцы из матрицы

set.seed(23) 
dt.data <- unname(as.matrix(data.frame(rnorm(5,30,2),rnorm(5,-3,1), 
       replicate(3,rnorm(5,5,1))))) 
dt.data 
#   [,1]  [,2]  [,3]  [,4]  [,5] 
#[1,] 30.38642 -1.892510 5.218288 5.308137 5.835391 
#[2,] 29.13064 -3.278086 3.953465 4.479822 4.433985 
#[3,] 31.82653 -1.980795 4.711311 4.557686 5.788419 
#[4,] 33.58678 -2.954563 5.481550 4.400687 3.834071 
#[5,] 31.99321 -1.424220 3.783624 6.294578 4.469180 

Я хотел бы, чтобы удалить все столбцы из матрицы, среднее значение меньше нуля или больше, чем 25 (то есть - первые 2 колонки выше). Я пытался его с функцией применения:

apply(dt.data,2, 
    function(x) if ((mean(x,na.rm=TRUE))>25 | (mean(x,na.rm=TRUE)<0)) { 
    dt.data<-dt.data[,-x] 
}) 

я могу использовать другие применить функцию, чтобы проверить средства и поместите их вручную, но я хотел бы обобщить эту процедуру. Вышеуказанная функция не работает и вызывает следующую ошибку:

Error in dt.data[, -x] : only 0's may be mixed with negative subscripts 

Любые советы?

+0

Я надеюсь, вы не возражаете, я заменил свой пример с воспроизводимой матрицей так и будущие читатели могут проверить код и играть дома. – thelatemail

ответ

1

colMeans должен это сделать:

m <- colMeans(dt.data, na.rm=TRUE) 
dt.data[, !(m > 25 | m < 0)] 
+0

Это сработало! Будет ли примененный подход работать также, или это обречено? – brandonEm

+0

Это не обязательно «обречено». Вы можете это сделать, но 'colMeans' - довольно стандартный способ делать то, что вы делаете, и быстро –

+0

@ user3837409 - применимая версия также более сложна:' dt.data [, apply (dt.data, 2, функция (x)! (Среднее (x)> 25 | среднее (x) <0))] ' – thelatemail

Смежные вопросы