2015-03-04 3 views
1

У меня есть dataframe вроде этого:Как рассчитать медианные значения без NA?

df 
name var1 var2 var3 var4 var5 ... 
site1 10 20 12 5  .. 
site2 15 NA 11 2  .. 
site3 NA 11 21 1  .. 
site4 9  18 NA 6  .. 

Я использую этот код для вычисления медианы столбцов.

apply(df[,c(2:4)], 2, median) 

Но он дает NA для столбцов с 2 по 4, поскольку они имеют значения NA. Как исключить значения NA и по-прежнему вычислять медианы из остальных данных в каждом столбце? Если для подмножества используется na.rm = T, все строки с NA будут удалены, а это не то, что я хочу. Спасибо за помощь.

ответ

2

Это работает:

df<-data.frame("a"=c(1,2,3, 4), "b"=c(1,NA,4, 5)) 

medianWithoutNA<-function(x) { 
    median(x[which(!is.na(x))]) 
} 

apply(df, 2, medianWithoutNA) 
    a b 
2.5 4.0 

Кстати, вы можете написать

apply(df[,2:4], 2, median) 

без c()

Пожалуйста, скажите мне, если решение работает для вас, и если да, принять мой ответ.

Это код, если вы хотите, чтобы вычислить медиану для каждого сайта:

df<-data.frame(name=c("site1", "site1", "site2", "site2", "site3"), a=c(1, 2, 3, 1, 3), b=c(3, 2, 3, 1,4)) 
aggregate(cbind(a, b) ~ name, data=df, medianWithoutNA) 
+1

Вы можете просто использовать 'применить (DF, 2, функция (х) медиана (х, па. rm = TRUE)) 'или даже лучше' apply (df [, 2: 4], 2, median, na.rm = TRUE) ' – shadowtalker

+0

@ssdecontrol ah ok, я не знал этого, я думал, что это то, что OP имел ввиду. –

+0

Я обнаружил, что некоторые строки имеют одно и то же имя, а некоторые нет. Так можно рассчитать медианы для строк с одинаковыми именами, например, классифицировать? Результаты должны иметь несколько средних значений для каждой переменной в соответствии с именами. Благодарю. –

5

Использование lapply, который не превращается в матрицу.

lapply(df[2:4], median, na.rm = TRUE) 
-1

Это должно работать:

for (i in 2:4) { 
    print(median(df[,i],na.rm=T)) 
} 

Или с именами столбцов:

for (i in 2:4) { 
    print(paste("Median",colnames(df)[i],"=",median(df[,i],na.rm=T))) 
} 
+0

Добро пожаловать mcam в SO - некоторые советы сосредоточены на новых неотвеченных вопросах, а не на старых вопросах. Ваши ответы вряд ли получат большую тягу (и не добавят много). – micstr

+0

Ваш ответ выводит только полученные результаты в окне консоли, но они не могут использоваться для дальнейших вычислений. OP использовал 'apply()' в своем Q, поэтому вполне вероятно, что просто печать может оказаться недостаточной. – Uwe

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