【问题标题】:How to calculate the median values without NAs?如何计算没有 NA 的中值?
【发布时间】:2023-03-29 08:22:01
【问题描述】:

我有一个这样的数据框:

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 的行都将被删除,这不是我想要的。感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用lapply,它不会转换为矩阵。

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

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 你可以使用apply(df, 2, function (x) median(x, na.rm = TRUE) ),或者更好的apply(df[, 2:4], 2, median, na.rm = TRUE)
      • @ssdecontrol 啊好吧,我不知道,我以为这就是OP的意思。
      • 我发现有些行有相同的名字,有些没有。那么是否可以计算具有相同名称的行的中位数,例如分类?根据名称,结果应该是每个变量的几个中值。谢谢。
      • @Lily 我很确定这是可能的,你能在你原来的问题中添加一个例子吗?只是我确定你的意思:)
      • 是的,名称列,每一行都有这样的名称:站点1,站点1,站点1,站点2,站点3,站点4,站点4等。如何计算中位数站点 1,站点 2,等等分别?是否也可以添加名称,所以我知道哪个名称对应于什么中位数?谢谢。
      【解决方案3】:

      这应该可行:

      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)))
      } 
      

      【讨论】:

      • 欢迎 mcam 加入 SO - 一些建议侧重于未回答的新问题,而不是旧问题。你的答案不太可能引起很大的关注(也不会增加太多)。
      • 您的答案仅在控制台窗口中打印结果值,但不能用于进一步计算。 OP 在他的 Q 中使用了apply(),因此简单的打印可能还不够。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多