计算几个向量的中位数

时间:2015-05-20 13:27:10

标签: r median

我需要计算ROE1ROE2ROE3的中位数。但是,要计算每个中位数,我必须包含具有相同Datum和相同Ind类别的所有行。例如,要计算第二行的中位数,我必须包括第2行和第3行,因为我在第2行和第3行中有相同的DatumInd。我正在尝试使用循环函数apply,但我不知道如何包含这个条件。

这就像一个条件中位数。

非常感谢你的关注。

这里是一个例子:

Datum   Ind ROE1    ROE2    ROE3
 95     45  NA      6       13
 95     45  18      25      28
 95     50  10      15      20

2 个答案:

答案 0 :(得分:2)

这是一个可能的data.table解决方案

library(data.table)
setDT(df)[, list(Median = median(unlist(.SD), na.rm = TRUE)), by = list(Datum, Ind)]
#    Datum Ind Median
# 1:    95  45     18
# 2:    95  50     15

另一种选择是先使用melt

整理数据
melt(setDT(df), id.vars = c("Datum", "Ind"))[, 
                  list(Median = median(value, na.rm = TRUE)), 
                  by = list(Datum, Ind)]

#    Datum Ind Median
# 1:    95  45     18
# 2:    95  50     15

或者如果你是Hadleyverse粉丝,也可以做

library(tidyr)
library(dplyr)
df %>%
  gather(Variable, value, -(Datum:Ind))%>%
  group_by(Datum, Ind) %>%
  summarise(Median = median(value, na.rm = TRUE))

# Source: local data frame [2 x 3]
# Groups: Datum
# 
#   Datum Ind Median
# 1    95  45     18
# 2    95  50     15

答案 1 :(得分:2)

另一个选项,使用基数R,你可以这样做:

med_by <- aggregate(df, by=list(df$Datum, df$Ind), median, na.rm=T)[, -(1:2)]  
data.frame(med_by[, 1:2], Median=apply(med_by[, grepl("ROE", colnames(med_by))], 1, median))

#   Datum Ind Median
# 1    95  45     18
# 2    95  50     15