R中数据框每第n行的列求和
Summing columns on every nth row of a data frame in R
我有从动物 运行 实验中获得的包含 12511 行和 16 列的数据框。每行代表 运行 每分钟计数每只动物。我想对每 60 行的列求和(即每小时计数)。
我尝试使用 apply 函数求和 60 行:
apply(rw[1:60,],2,sum)
apply(rw[61:120,],2,sum)
apply(rw[121:180,],2,sum)
...一直这样做到 12511 是不可想象的,而且很耗时。
我确信有一种聪明的方法可以将我的数据压缩到 208 行。请帮忙!!
谢谢。
这是我使用 David Arenburg 数据的版本:
set.seed(123)
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511))
ind <- c(rep(60, floor(dim(rw)[1]/60)), floor(dim(rw)[1]%%60))
ind <- rep(1:length(ind), times = ind)
head(apply(rw, 2, function(x) tapply(x, ind, sum)))
a b c
1 378678 387703 388143
2 384532 331275 341092
3 355397 367039 369012
4 378483 355384 367988
5 365193 372779 388020
6 387260 386737 347777
这是一种使用 data.table
包和矢量化 colSums
函数
的方法
先是一些数据:
set.seed(123)
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511))
然后,我们将使用 gl
和 运行 colSums
每组
创建索引
library(data.table)
setDT(rw)[, as.list(colSums(.SD)), by = gl(ceiling(12511/60), 60, 12511)]
# gl a b c
# 1: 1 378678 387703 388143
# 2: 2 384532 331275 341092
# 3: 3 355397 367039 369012
# 4: 4 378483 355384 367988
# 5: 5 365193 372779 388020
# ---
# 205: 205 385361 409004 389946
# 206: 206 407232 406940 345496
# 207: 207 363253 357317 356878
# 208: 208 387336 383786 348978
# 209: 209 186874 188616 183500
另一个类似的方法是
setDT(rw)[, lapply(.SD, sum), by = gl(ceiling(12511/60), 60, 12511)]
或者使用dplyr
s summarise_each
函数,同样可以做到
library(dplyr)
rw %>%
group_by(indx = gl(ceiling(12511/60), 60, 12511)) %>%
summarise_each(funs(sum))
# Source: local data table [209 x 4]
#
# indx a b c
# 1 1 378678 387703 388143
# 2 2 384532 331275 341092
# 3 3 355397 367039 369012
# 4 4 378483 355384 367988
# 5 5 365193 372779 388020
# 6 6 387260 386737 347777
# 7 7 343980 412633 383429
# 8 8 355059 352393 336798
# 9 9 372722 386863 425622
# 10 10 406628 370606 362041
# .. ... ... ... ...
我有从动物 运行 实验中获得的包含 12511 行和 16 列的数据框。每行代表 运行 每分钟计数每只动物。我想对每 60 行的列求和(即每小时计数)。
我尝试使用 apply 函数求和 60 行:
apply(rw[1:60,],2,sum)
apply(rw[61:120,],2,sum)
apply(rw[121:180,],2,sum)
...一直这样做到 12511 是不可想象的,而且很耗时。
我确信有一种聪明的方法可以将我的数据压缩到 208 行。请帮忙!!
谢谢。
这是我使用 David Arenburg 数据的版本:
set.seed(123)
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511))
ind <- c(rep(60, floor(dim(rw)[1]/60)), floor(dim(rw)[1]%%60))
ind <- rep(1:length(ind), times = ind)
head(apply(rw, 2, function(x) tapply(x, ind, sum)))
a b c
1 378678 387703 388143
2 384532 331275 341092
3 355397 367039 369012
4 378483 355384 367988
5 365193 372779 388020
6 387260 386737 347777
这是一种使用 data.table
包和矢量化 colSums
函数
先是一些数据:
set.seed(123)
rw <- data.frame(a = sample(12511), b = sample(12511), c = sample(12511))
然后,我们将使用 gl
和 运行 colSums
每组
library(data.table)
setDT(rw)[, as.list(colSums(.SD)), by = gl(ceiling(12511/60), 60, 12511)]
# gl a b c
# 1: 1 378678 387703 388143
# 2: 2 384532 331275 341092
# 3: 3 355397 367039 369012
# 4: 4 378483 355384 367988
# 5: 5 365193 372779 388020
# ---
# 205: 205 385361 409004 389946
# 206: 206 407232 406940 345496
# 207: 207 363253 357317 356878
# 208: 208 387336 383786 348978
# 209: 209 186874 188616 183500
另一个类似的方法是
setDT(rw)[, lapply(.SD, sum), by = gl(ceiling(12511/60), 60, 12511)]
或者使用dplyr
s summarise_each
函数,同样可以做到
library(dplyr)
rw %>%
group_by(indx = gl(ceiling(12511/60), 60, 12511)) %>%
summarise_each(funs(sum))
# Source: local data table [209 x 4]
#
# indx a b c
# 1 1 378678 387703 388143
# 2 2 384532 331275 341092
# 3 3 355397 367039 369012
# 4 4 378483 355384 367988
# 5 5 365193 372779 388020
# 6 6 387260 386737 347777
# 7 7 343980 412633 383429
# 8 8 355059 352393 336798
# 9 9 372722 386863 425622
# 10 10 406628 370606 362041
# .. ... ... ... ...