所选行的中位数取决于其他列值
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)
我想分别计算每个 ID
和 week
的 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]
我有以下数据框(这里只是一个大数据框的一小部分)
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)
我想分别计算每个 ID
和 week
的 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]