求每组的均值
Find Mean in Each Group
在每个组中,我想找到两个子组的平均值。明确地说,数据如下所示:
Group Val1 Val2 Val3
1 50 0.03 50.1
1 50.2 0.05 50.1
2 50.3 0.01 50.1
1 50 0.03 50.2
1 50.1 0.04 50.2
1 50 0.01 50.3
1 50 0.02 50.3
2 50.3 0.03 50.3
在Val3的每个组中,我想计算Val2在Group 1中的平均值和Val2在Group 2中的平均值。在某些情况下,对于Val3,Group 2中没有成员。这是代码我试过了。
fileB.mean.dat <- tapply(combined.sorted.data[combined.sorted.data[,1] == 2,3], combined.sorted.data[combined.sorted.data[,1] == 2,4], mean)
我不知道如何在上面的代码中包含检查是否有组 2 的成员,如果没有则使 Val 3 的平均值为 0。换句话说,应该有一个代表性的平均值对于第 1 组和第 2 组,对于 Val 3 的每个值。
您可以使用 reshape2
的 dcast
来根据您的喜好转换 的输出。
library(reshape2)
dcast(data = aggregate(Val2 ~ Group + Val3, data = df, mean),
formula = Group~Val3,
value.var = "Val2")
# Group 50.1 50.2 50.3
#1 1 0.04 0.035 0.015
#2 2 0.01 NA 0.030
或者你也可以在 base R 中做,但相对来说会更复杂
sapply(split(df[c("Group", "Val2")], df$Val3),
function(a) sapply(unique(df$Group),
function(x) setNames(mean(a$Val2[a$Group == x]), x)))
# 50.1 50.2 50.3
#1 0.04 0.035 0.015
#2 0.01 NaN 0.030
数据
df = structure(list(Group = c(1, 1, 5, 1, 1, 1, 1, 5), Val1 = c(50,
50.2, 50.3, 50, 50.1, 50, 50, 50.3), Val2 = c(0.03, 0.05, 0.01,
0.03, 0.04, 0.01, 0.02, 0.03), Val3 = c(50.1, 50.1, 50.1, 50.2,
50.2, 50.3, 50.3, 50.3)), .Names = c("Group", "Val1", "Val2",
"Val3"), row.names = c(NA, -8L), class = "data.frame")
我们可以使用tidyverse
library(tidyverse)
df %>%
group_by(Group, Val3) %>%
summarise(Val2 = mean(Val2)) %>%
spread(Val3, Val2)
# A tibble: 2 x 4
# Groups: Group [2]
# Group `50.1` `50.2` `50.3`
#* <dbl> <dbl> <dbl> <dbl>
#1 1 0.04 0.035 0.015
#2 2 0.01 NA 0.030
在每个组中,我想找到两个子组的平均值。明确地说,数据如下所示:
Group Val1 Val2 Val3
1 50 0.03 50.1
1 50.2 0.05 50.1
2 50.3 0.01 50.1
1 50 0.03 50.2
1 50.1 0.04 50.2
1 50 0.01 50.3
1 50 0.02 50.3
2 50.3 0.03 50.3
在Val3的每个组中,我想计算Val2在Group 1中的平均值和Val2在Group 2中的平均值。在某些情况下,对于Val3,Group 2中没有成员。这是代码我试过了。
fileB.mean.dat <- tapply(combined.sorted.data[combined.sorted.data[,1] == 2,3], combined.sorted.data[combined.sorted.data[,1] == 2,4], mean)
我不知道如何在上面的代码中包含检查是否有组 2 的成员,如果没有则使 Val 3 的平均值为 0。换句话说,应该有一个代表性的平均值对于第 1 组和第 2 组,对于 Val 3 的每个值。
您可以使用 reshape2
的 dcast
来根据您的喜好转换
library(reshape2)
dcast(data = aggregate(Val2 ~ Group + Val3, data = df, mean),
formula = Group~Val3,
value.var = "Val2")
# Group 50.1 50.2 50.3
#1 1 0.04 0.035 0.015
#2 2 0.01 NA 0.030
或者你也可以在 base R 中做,但相对来说会更复杂
sapply(split(df[c("Group", "Val2")], df$Val3),
function(a) sapply(unique(df$Group),
function(x) setNames(mean(a$Val2[a$Group == x]), x)))
# 50.1 50.2 50.3
#1 0.04 0.035 0.015
#2 0.01 NaN 0.030
数据
df = structure(list(Group = c(1, 1, 5, 1, 1, 1, 1, 5), Val1 = c(50,
50.2, 50.3, 50, 50.1, 50, 50, 50.3), Val2 = c(0.03, 0.05, 0.01,
0.03, 0.04, 0.01, 0.02, 0.03), Val3 = c(50.1, 50.1, 50.1, 50.2,
50.2, 50.3, 50.3, 50.3)), .Names = c("Group", "Val1", "Val2",
"Val3"), row.names = c(NA, -8L), class = "data.frame")
我们可以使用tidyverse
library(tidyverse)
df %>%
group_by(Group, Val3) %>%
summarise(Val2 = mean(Val2)) %>%
spread(Val3, Val2)
# A tibble: 2 x 4
# Groups: Group [2]
# Group `50.1` `50.2` `50.3`
#* <dbl> <dbl> <dbl> <dbl>
#1 1 0.04 0.035 0.015
#2 2 0.01 NA 0.030