我需要计算ROE1
,ROE2
和ROE3
的中位数。但是,要计算每个中位数,我必须包含具有相同Datum
和相同Ind
类别的所有行。例如,要计算第二行的中位数,我必须包括第2行和第3行,因为我在第2行和第3行中有相同的Datum
和Ind
。我正在尝试使用循环函数apply
,但我不知道如何包含这个条件。
这就像一个条件中位数。
非常感谢你的关注。
这里是一个例子:
Datum Ind ROE1 ROE2 ROE3
95 45 NA 6 13
95 45 18 25 28
95 50 10 15 20
答案 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