我有一个这样的数据框:
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的行,这不是我想要的。谢谢你的帮助。
答案 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)))
}