Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用于添加多个列的累积和的函数_R_Cumulative Sum - Fatal编程技术网

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我爱你!:)