R -计算几个向量的中位数



我需要计算ROE1, ROE2ROE3的中位数。但是,为了计算每个中位数,我必须包括具有相同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

这是一个可能的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

另一个选项,使用base 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

最新更新