对R中数据帧的越来越多的列求和

时间:2015-11-16 14:18:58

标签: r

我需要逐行提取data.frame的求和子集,并使用输出返回一个新的data.frame。但是,我希望每次增加4个列的总和。因此,例如,我想要自己提取第一列,然后逐行提取第2列到第6列,然后是第7列到第15列,依此类推。

我有这个代码,它将data.frame中的常量列数(通过最大试验次数)返回到一个新的data.frame-我只需要找到一种方法来添加升级函数。

t<- max(as.numeric(df[,c(5)]))

process.row <- function (x){
  sapply(1:t,function(i){
return(sum(as.numeric(x[c((6+(i-1)*5):(10+(i-1)*5))] 
)
)
)
 })
}

t(apply(df,1,process.row)) -> collated.data

我一直在努力做到这一点,所以非常感谢任何帮助。我无法在其他地方找到答案,如果我错过了某些内容,请道歉。

2 个答案:

答案 0 :(得分:0)

您正在寻找的是一个函数,它提供x(系列的较低值),对于序列部分i看起来像这样:

Function

r中,代码如下所示:

# the foo part of the function
foo <- function(x) ifelse(x > 0, 1 + (x - 1) * 4, 0)

# the wrapper of the function 
min.val <- function(i){
  ifelse(i == 1, 1, 1 + sum(sapply(1:(i - 1), foo)))
}

# takes only one value
min.val(1)
# [1] 1
min.val(2)
# [1] 2
min.val(3)
# [1] 7

# to calculate multiple values, use it like this
sapply(1:5, min.val)
#[1]  1  2  7 16 29

如果您想获得最大数量,可以创建另一个函数,如下所示

max.val <- function(i) min.val(i + 1) - 1
sapply(1:5, max.val)
#[1]  1  6 15 28 45

测试:

# creating a series to test it
series <- 1:20
min.vals <- sapply(series, min.val)
max.vals <- sapply(series, max.val)

dat <- data.frame(min = min.vals, max = max.vals)
# dat
#    min max
# 1    1   1
# 2    2   6
# 3    7  15
# 4   16  28
# 5   29  45
# 6   46  66
# 7   67  91
# 8   92 120
# 9  121 153
# 10 154 190
# 11 191 231
# 12 232 276
# 13 277 325
# 14 326 378
# 15 379 435
# 16 436 496
# 17 497 561
# 18 562 630
# 19 631 703
# 20 704 780

这会给你你想要的吗?

答案 1 :(得分:0)

我原以为你想要对所选列子集的行进行求和。如果是这样,也许这会有所帮助。

# fake data
mydf <- as.data.frame(matrix(sample(45*5), nrow=5))
mydf

# prepare matrix of start and ending columns
n <- 20
i <- 1:n
ncols <- 1 + (i-1)*4
endcols <- cumsum(ncols)
startcols <- c(1, cumsum(ncols[-length(endcols)])+1)
mymat <- cbind(endcols, startcols)

# function to sum the rows
myfun <- function(df, m) {
  # select subset with end columns within the dimensions of the given df
  subm <- m[m[, 2] <= dim(df)[2], ]
  # sum up the selected columns of df by rows
  sapply(1:dim(subm)[1], function(j) 
    rowSums(df[, subm[j, 1]:subm[j, 2], drop=FALSE]))
}

mydf
myfun(df=mydf, m=mymat)