-3

我有看起来像这样的数据:

Time ColA ColB ColC
0    1    10   5
1    3    7    15
2    0    8    9
3    3    4    5
4    4    5    6
7    10   23   4

我想将我的数据分组为大小相等的时间间隔,并对每列的变量求和。例如,这将是时间按 2 分组的结果:

Time ColA ColB ColC
0    4    17   20
2    3    12   14
4    4    5    6
7    10   23   4

我可以通过引入一个值为 的新列来标记数据floor(data$Time/2),但不清楚如何求和。我看过的大多数包似乎只总结了一列,而我想总结所有列。

4

3 回答 3

6

使用“data.table”包!语法更简单,运行时间更快。

### Load package
require(data.table)

### Set up variables; Create data.table
time <- c(0:4, 7)
ColA <- c(1, 3, 0, 3, 4, 10)
ColB <- c(10, 7, 8, 4, 5, 23)
ColC <- c(5, 15, 9, 5, 6, 4)
data <- data.table(time, ColA, ColB, ColC)

### Determine which columns we want to apply the function to
sum.cols <- grep("Col", names(data), value = T)   

### Sum each column within each group
data[, lapply(.SD, sum), by = floor(time / 2), .SDcols = sum.cols]

### Output:
    floor ColA ColB ColC
1:     0    4   17   20
2:     1    3   12   14
3:     2    4    5    6
4:     3   10   23    4

请注意,符号“.SD”指的是“数据子集”。在这种情况下,lapply 函数迭代数据表的列,将函数“sum”应用于每一列。在每一列中,为我们的“地板”变量的每个级别计算总和。

于 2013-08-22T18:17:23.087 回答
2

只是为了证明 Ferdinand.Kraft 的“重复”调用是正确的,并且可以说更接近所请求的内容,其中包括查看在原始单位中创建的间隔的请求。

> aggregate(data[-1], list(cut(data$Time, include.lowest=TRUE, 
                            right=FALSE, breaks=seq(range(data$Time)[1], 
                                                  range(data$Time)[2]+1, 
                                                  by=2))) ,
                      sum)

  Group.1 ColA ColB ColC
1   [0,2)    4   17   20
2   [2,4)    3   12   14
3   [4,6)    4    5    6
4   [6,8]   10   23    4
于 2013-08-22T20:25:38.737 回答
0

只是为了后代,这是解决 OP 问题的“plyr”方法。使用 'plyr' 函数优于 'data.table' 函数的唯一真正优势是您可以使用非 data.table 对象。

设置:首先,这是要使用的数据:

data <- read.table(text="
    Time ColA ColB ColC
    0    1    10   5
    1    3    7    15
    2    0    8    9
    3    3    4    5
    4    4    5    6
    7    10   23   4
    ", header=TRUE)

Ply-it : 这里输入一个数据帧 (d) 和输出一个数据帧 (d),所以我们将使用 'ddply' 函数。

ddply(
    data[, -1], 
    .(Time=floor(data$Time/2)), 
    colSums)

  #   Time ColA ColB ColC
  # 1    0    4   17   20
  # 2    1    3   12   14
  # 3    2    4    5    6
  # 4    3   10   23    4

我们告诉 'ddply' 对数据使用变量 'data'(减去包含时间的第一列),以 为索引floor(data$Time/2),并通过运行 'colSums' 创建具有其余列总和的列作用于每组行。

于 2013-08-22T18:46:20.483 回答