通过对R中的范围内的数据求和来对它们进行分组

机器算法验证 r 数理统计
2022-04-18 05:08:36

我有这样的数据:

      year   nb
1     1901  208
2     1902  200
3     1903  223
4     1904  215
5     1905  187
6     1906  214

我想指定级别,以便我可以这样总结数据:

      years   nb
1     1901-1910  2082
2     1911-1920  6200

在那之前,我很难通过分组、聚合或编码来做到这一点。我发现了一种非常丑陋的做法,就像这样:

sum(DF$nb[DF$year> 1901 & DF$year <= 1910])

但我想知道是否有更优雅的方式来做到这一点。

对不起,如果我的问题太基本了,泽维尔

2个回答

cut一种选择是使用 Hmisc 包或cut2在 Hmisc 包中为您的 bin 创建一个新变量。

dat <- data.frame(year = 1901:2000, value = runif(100))
dat <- transform(dat, bin = cut(year, 10))

然后我可能会用plyr摘要来分组:

library(plyr)
ddply(dat, "bin", summarize, totVal = sum(value))

的帮助页面cut应该说明定义标签,如何处理边缘情况(包括/排除最小值或最大值)等。

有趣的追逐。我还没有看到转换,并且可能会以这种(第二种)方式做到这一点:

set.seed(1234)
dat <- data.frame(year = 1901:2000, value = runif(100))
dat <- transform(dat, bin = cut(year, 10))

set.seed(1234)
dat2 <- data.frame(year = 1901:2000, value = runif(100))
dat2$bin <- cut(dat$year, 10)

identical(dat,dat2) # true

从那以后,我会期待:

dat2$bin <- cut(dat$year, 10, labels=F) # this gives you 1:10 as labels rather than the very messy 'intervals'
aggregate(value~bin, data=dat2, sum)

> aggregate(value~bin, data=dat2, sum)
   bin    value
1    1 4.892264
2    2 4.546337
3    3 4.165217
4    4 4.733585
5    5 5.136625
6    6 4.530420
7    7 3.616002
8    8 3.864675
9    9 4.936536
10  10 3.328065