如何在没有NA的情况下计算中值?

时间:2015-03-04 05:06:45

标签: r

我有一个这样的数据框:

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)

但它为第2列到第4列提供NA,因为它们具有NA值。如何排除NA值并仍然从每列中的其余数据计算中位数?如果对子集使用na.rm = T,则将删除所有具有NA的行,这不是我想要的。谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

使用lapply,但不转换为矩阵。

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

答案 1 :(得分: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)

答案 2 :(得分:-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)))
}