R 用于添加多个列的累积和的函数
想象一个数据集,它由多个数值向量和两个因子向量组成,就像这样(为此目的而构建)R 用于添加多个列的累积和的函数,r,cumulative-sum,R,Cumulative Sum,想象一个数据集,它由多个数值向量和两个因子向量组成,就像这样(为此目的而构建) name您可以在dplyr中跨使用 库(dplyr) colCumsum名称性别出生v4 v5 v6 v7 cumsum_v4 cumsum_v5 cumsum_v6 cumsum_v7 #>1提姆男1985 51010 0 #>2汤姆男1986 420093030 #>3本男1985 3603201630620 #>4玛丽女1986 220 4 14 650 10 24 #>5简女1984 15 5 60 15 6
name您可以在dplyr
中跨使用
库(dplyr)
colCumsum名称性别出生v4 v5 v6 v7 cumsum_v4 cumsum_v5 cumsum_v6 cumsum_v7
#>1提姆男1985 51010 0
#>2汤姆男1986 420093030
#>3本男1985 3603201630620
#>4玛丽女1986 220 4 14 650 10 24
#>5简女1984 15 5 60 15 655 15 84
您可以在dplyr
中跨使用:
库(dplyr)
colCumsum名称性别出生v4 v5 v6 v7 cumsum_v4 cumsum_v5 cumsum_v6 cumsum_v7
#>1提姆男1985 51010 0
#>2汤姆男1986 420093030
#>3本男1985 3603201630620
#>4玛丽女1986 220 4 14 650 10 24
#>5简女1984 15 5 60 15 655 15 84
您可以像这样重写colColsum
:
colCumsum2 <- compiler::cmpfun(function(x) {
for (i in 1:ncol(x))
{if (is.numeric(x[,i]) == F) {next}}
#exlude non-numeric from function
x[,i+ncol(n)-3] <- cumsum(x[,i])
#add cumulative sum as extra column
x
} )
colCumsum <- function(x) {
check <- sapply(x, is.numeric)
x[paste0(names(x)[check], "_cumsum")] <- lapply(x[check], cumsum)
x
}
作为参考,您可以重写循环,只关注数值列,以使其正常工作:
colCumsum2 <- function(x) {
for (i in 1:ncol(x)) {
if (is.numeric(x[, i])) {
x[, paste0(names(x)[i], "_cumsum")] <- cumsum(x[, i])
}
}
x
}
colCumsum2您可以像这样重写colColsum
:
colCumsum2 <- compiler::cmpfun(function(x) {
for (i in 1:ncol(x))
{if (is.numeric(x[,i]) == F) {next}}
#exlude non-numeric from function
x[,i+ncol(n)-3] <- cumsum(x[,i])
#add cumulative sum as extra column
x
} )
colCumsum <- function(x) {
check <- sapply(x, is.numeric)
x[paste0(names(x)[check], "_cumsum")] <- lapply(x[check], cumsum)
x
}
作为参考,您可以重写循环,只关注数值列,以使其正常工作:
colCumsum2 <- function(x) {
for (i in 1:ncol(x)) {
if (is.numeric(x[, i])) {
x[, paste0(names(x)[i], "_cumsum")] <- cumsum(x[, i])
}
}
x
}
colCumsum2在matrixStats
包中有一个colCumsums
函数。只需cbind
cumsums
cbind(df, as.data.frame(matrixStats::colCumsums(as.matrix(df[nums]))))
# name sex born v4 v5 v6 v7 V1 V2 V3 V4
# 1 tim male 1985 5 10 1 0 5 10 1 0
# 2 tom male 1986 9 30 3 0 14 40 4 0
# 3 ben male 1985 12 630 6 20 26 670 10 20
# 4 mary female 1986 14 650 10 24 40 1320 20 44
# 5 jane female 1984 15 655 15 84 55 1975 35 128
在matrixStats
包中有一个colCumsums
函数。只需cbind
cumsums
cbind(df, as.data.frame(matrixStats::colCumsums(as.matrix(df[nums]))))
# name sex born v4 v5 v6 v7 V1 V2 V3 V4
# 1 tim male 1985 5 10 1 0 5 10 1 0
# 2 tom male 1986 9 30 3 0 14 40 4 0
# 3 ben male 1985 12 630 6 20 26 670 10 20
# 4 mary female 1986 14 650 10 24 40 1320 20 44
# 5 jane female 1984 15 655 15 84 55 1975 35 128
很高兴在越来越整洁的数据帧处理领域中看到BaseR解决方案+1@AllanCameron谢谢我很欣赏tidyverse试图实现的目标,但我倾向于坚持使用base或data.table。看到像你这样的答案,不断更新不同的方法总是很好的。@AllanCameron我爱你!:)很高兴在越来越整洁的数据帧处理领域中看到BaseR解决方案+1@AllanCameron谢谢我很欣赏tidyverse试图实现的目标,但我倾向于坚持使用base或data.table。看到像你这样的答案,不断更新不同的方法总是很好的。@AllanCameron我爱你!:)