R 中平均值列的频率 Table

Frequency Table with Column of Average in R

给定一个数据帧df,我生成如下:

set.seed(1)
b <- runif(100)
set.seed(1)
a <- sample.int(9, 100, replace = TRUE)
df <- data.frame(a,b)

我形成了如下图的频率table但不满意:

sortted_a <- data.frame(table(df$a))
sortted_a
#  Var1 Freq
#1    1   14
#2    2    8
#3    3   10
#4    4    9
#5    5   11
#6    6   11
#7    7    5
    8   14
#9    9   18

我更想要一个 table,它不仅会显示 vector afrequency,还会显示 frequency of a 以及关联的 averages of vector b,如下所示在 R:

#  Var1 Freq   Ave_b
#1    1   14   0.6750
#2    2    8   0.0027
#3    3   10   0.8298
#4    4    9   0.1873
#5    5   11   0.3874
#6    6   11   0.7632
#7    7    5   0.5812
    8   14   0.5478
#9    9   18   0.4389

dplyr 中,您可以按 a 分组并计算 b 列的频率和平均值:

library(dplyr)

df %>%
  group_by(a) %>%
  summarise(Freq = n(), 
            b = mean(b))

类似地,在 base R 和 data.table 中:

aggregate(b~a, df, function(x) c(Freq = length(x), b = mean(x)))

library(data.table)
setDT(df)[, .(Freq = .N, b = mean(b)), a]

如果你想坚持使用基数 R,你可以使用 tapply() 求 a 的 b 的平均值,然后 cbind() 用你的排序 data.frame:

ave_b <- tapply(df$b,df$a,mean)
new_df <- cbind(sortted_a, ave_b)