计算 R 中数据帧中行和列的中位数
Computing the median over both rows and columns in a dataframe in R
我的数据框如下所示:
Group1 | Group2 | Score1 | Score2
-------|--------|--------|--------
A | 1 | 10 | 11
A | 2 | 13 | 14
B | 1 | 4 | 7
B | 2 | 9 | 12
A | 1 | 5 | 11
B | 2 | 9 | 13
A | 2 | 7 | 9
B | 1 | 7 | 10
我需要的是创建一个新变量,它为我提供每个子组组合的中值,例如
Group1 | Group2 | Score1 | Score2 | Median
-------|--------|--------|--------|-------
A | 1 | 10 | 11 | 10.5
A | 2 | 13 | 14 | 11.5
B | 1 | 4 | 7 | 7.0
B | 2 | 9 | 12 | 10.5
A | 1 | 5 | 11 | 10.5
B | 2 | 9 | 13 | 10.5
A | 2 | 7 | 9 | 11.5
B | 1 | 7 | 10 | 7.0
(我手工计算的中位数可能是错误的,但我认为已经说明了这一点)。
我试过像这样使用聚合函数:
MedianAggregate <- aggregate(df[,45:47],
by = list(df$provider, df$field),
FUN = median)
我得到的,而不是我想要的,是这样的:
Group1 | Group2 | Score1 | Score2
-------|--------|--------|--------
A | 1 | 7.5 | 11
A | 2 | 10 | 11.5
B | 1 | 5.5 | 8.5
B | 2 | 9 | 12.5
基本上我需要的是获得相同的输出,如果我将中值函数应用于矩阵中的三行,而不是数据帧,对于子组的每个组合。
如有任何帮助,我们将不胜感激。
如果我理解正确的话,这是一个可能的解决方案:
library(reshape2)
library(dplyr)
df2 <- melt(df, id.vars = c("Group1","Group2"))
df2 %>% group_by(Group1, Group2) %>% summarise(median = median(value)) %>% merge(df, by = c("Group1","Group2"))
我的数据框如下所示:
Group1 | Group2 | Score1 | Score2
-------|--------|--------|--------
A | 1 | 10 | 11
A | 2 | 13 | 14
B | 1 | 4 | 7
B | 2 | 9 | 12
A | 1 | 5 | 11
B | 2 | 9 | 13
A | 2 | 7 | 9
B | 1 | 7 | 10
我需要的是创建一个新变量,它为我提供每个子组组合的中值,例如
Group1 | Group2 | Score1 | Score2 | Median
-------|--------|--------|--------|-------
A | 1 | 10 | 11 | 10.5
A | 2 | 13 | 14 | 11.5
B | 1 | 4 | 7 | 7.0
B | 2 | 9 | 12 | 10.5
A | 1 | 5 | 11 | 10.5
B | 2 | 9 | 13 | 10.5
A | 2 | 7 | 9 | 11.5
B | 1 | 7 | 10 | 7.0
(我手工计算的中位数可能是错误的,但我认为已经说明了这一点)。
我试过像这样使用聚合函数:
MedianAggregate <- aggregate(df[,45:47],
by = list(df$provider, df$field),
FUN = median)
我得到的,而不是我想要的,是这样的:
Group1 | Group2 | Score1 | Score2
-------|--------|--------|--------
A | 1 | 7.5 | 11
A | 2 | 10 | 11.5
B | 1 | 5.5 | 8.5
B | 2 | 9 | 12.5
基本上我需要的是获得相同的输出,如果我将中值函数应用于矩阵中的三行,而不是数据帧,对于子组的每个组合。
如有任何帮助,我们将不胜感激。
如果我理解正确的话,这是一个可能的解决方案:
library(reshape2)
library(dplyr)
df2 <- melt(df, id.vars = c("Group1","Group2"))
df2 %>% group_by(Group1, Group2) %>% summarise(median = median(value)) %>% merge(df, by = c("Group1","Group2"))