所选行的中位数取决于其他列值

median of selected rows dependent on other columns values

我有以下数据框(这里只是一个大数据框的一小部分)

ID= c(1,1,1,2,2,2,2,3,3)
week = c(1,1,2,1,1,2,2,1,2)
X = c(3.3,4.23,5.6,12,3.1,4.3,5.9,6.1,5.3)
Y = c(1.3,2.4,6.8,5.5,4.3,3,6.6,2.6,5.7)
TS_DF = data.frame(ID,week,X,Y)

我想分别计算每个 IDweek 的 X 和 Y 的中位数,这样结果就这样

ID    week  X     Y     weekMedX    weekMedY
1     1     3.3   1.3   3.765       1.85
1     1     4.23  2.4   3.765       1.85
1     2     5.6   6.8   5.6         6.8
2     1     12    5.5   7.55        4.9
2     1     3.1   4.3   7.55        4.9
2     2     4.3   3     5.1         4.8
2     2     5.9   6.6   5.1         4.8
3     1     6.1   2.6   6.1         2.6
3     2     5.3   5.7   5.3         5.7

基于this discusssion我想出了下面的代码

b = TS_DF %>%
  group_by(ID) %>%
  group_by(week) %>%
  summarise(median = median(X))

但我得到了错误的结果

# A tibble: 2 x 2
week median
<dbl>  <dbl>
1     1   4.23
2     2   5.45

如有任何想法,我们将不胜感激。 M

正如评论员所建议的,这应该有效:

b = TS_DF %>%
  group_by(ID, week)  %>%
  mutate(median_X = median(X), median_Y = median(Y))

如果您走的是汇总路线,则可以使用联接将所有数据放在一起。

median_df = TS_DF %>%
  group_by(ID, week) %>%
  summarise(median = median(X))

final_df <- left_join(TS_DF, median_df, by = c('ID', 'week'))

这应该会为您提供原始数据框和计算出的中位数。

正如一些评论者已经提到的:

只使用一个 group_by() 表达式:

library(dplyr)
TS_DF %>% 
  group_by(ID, week) %>% 
  summarise(median_X = median(X),
            median_Y = median(Y))

否则只使用最后的group_by()。另见

的输出
TS_DF %>%
  group_by(ID, week)  

小标题:9 x 4 群组:ID,周 [6]

与输出:

TS_DF %>%
  group_by(ID) %>%
  group_by(week) 

小标题:9 x 4 团体:周 [2]