在 R 中总结、重新分组和绘制组频率数据集的有效方法

Efficient way to summarise, re-group and plot data set of group frequencies in R

我有一组三组(A、B、C)的数据,其中提供了关于该组(0到 100)。举个简化的例子:

df <- data.frame(x = seq(-3, 3, 1),
                 A = c(0, 10, 25, 30, 15, 0, 0),
                 B = c(25, 30, 24, 29, 2, 15, 0),
                 C = c(0, 0, 5, 10, 20, 30, 30))

然而,实际的数据集很大,所以有大量非常详细的x值(至少两位小数),每个组都有相关的频率,对于某些x,频率通常会下降到接近零值。使用以下命令绘制此图时,结果看起来相当复杂。

df <- melt(df, id = "x")
ggplot(df, aes(x=x, y=value, color=variable)) + geom_line()

  1. 计算每个项目的汇总统计数据的最佳方法是什么? 团体? (平均数、中位数、...)
  2. 聚合 x 值及其值的最有效方法是什么 邻居进入 x 值的范围,总结相关组 过程中的频率,以获得更概括的画面?
  3. 如何告诉 ggplot 生成直方图或密度图 考虑到观察到的频率,这样就可以 得到 情节看起来像这样?

我考虑过遍历数据集并执行上述所有操作 "manually",但认为这样做效率低下且容易出错。如果您有任何建议,我们将不胜感激!

为了创建直方图,您需要删除 "value" 变量并根据该值为 "x" 创建相应的行数。因此,如果对于 A 组,您有 x = 3 且值 = 10,则该过程必须为 A 组创建 x = 3 10 次。 运行 这个过程一步一步看它是如何工作的。我为 "x".

添加了小数
library(reshape2)
library(dplyr)
library(ggplot2)

set.seed(22)
df <- data.frame(x = seq(-3, 3, 0.01),
                 A = round(c(rnorm(200, 30,3),rnorm(401,20,4))),
                 B = round(c(rexp(300, 1/5), rexp(301,1/20))),
                 C = round(runif(601, 2, 25)))

df <- melt(df, id = "x")


# create number of rows for each x and group based on the value
df2=
    df %>% 
  rowwise() %>% 
  do(data.frame(x = rep(.$x, .$value),
                variable = rep(.$variable, .$value))) %>%
  ungroup


# check mean and median x values for each group
df2 %>% 
  group_by(variable) %>% 
  summarise(N = n(),
            MEAN_X= mean(x),
            MEDIAN_X= median(x))

#   variable     N      MEAN_X MEDIAN_X
# 1        A 13979 -0.27480292    -0.47
# 2        B  7051  0.84527159     1.03
# 3        C  7906 -0.03190741    -0.07



ggplot(df2, aes(x=x, fill=variable)) +
  geom_histogram(binwidth=.2, alpha=.5, position="dodge")

ggplot(df2, aes(x=x, colour=variable)) + 
  geom_density()

如果你想根据频率对每个组的 x 进行分组,你可以使用回归树方法将 x 分成 bins 并给出断点:

library(party)

# tree for group A only
model = ctree(value~x+variable, data = df[df$variable=="A",])

plot(model, type = "simple")

这告诉您,对于 A 组,在 x = -1.01 处有一个断点(您也可以从直方图中看到),它将 x 分成两组。左侧的平均值 = 29.8,右侧的平均值 = 19.99。每个 bin 中的观察数分别为 200 和 401。这听起来是正确的,因为我在一开始就创建了这个变量。

请注意,树是统计模型,它根据统计显着差异(或其他指标)拆分变量。您不能自己强制进行任何分组。如果你想这样做,最好将你的变量 "x" 分组到 N 组中(可能基于分位数?或者其他对你更有意义的东西)并查看这些组中的值如何变化。