对R中4个连续列的组的值求和

时间:2016-09-13 16:29:30

标签: r sum

从R中的372列和12,000行的表开始,我需要创建一个新表,其中的列包含行,列的行数为1:4,然后是5:8,然后是9:12,依此类推至原始表格的第372栏。这是一个简短的例子:

输入:

m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 7L,
+ 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"), c("a", "b",
+"c", "d", "e", "f", "g", "h")))

看起来像这样:

    a  b  c  d  e  f  g  h
r1  3  2  3  1  1  2  3  1
r2  1  6  1  8  5  1  7  1

预期产出:

    A  B
r1  9  7
r2  16 14

因此,A = a + b + c + d,B = e + f + g + h。使用Excel中的小桌子很容易。如果有帮助,列a-d对应于一个组,e-f对应另一个组。

4 个答案:

答案 0 :(得分:4)

这个问题目前尚未明确,但假设你有一个矩阵......

m = structure(c(3L, 1L, 2L, 6L, 3L, 1L, 1L, 8L, 1L, 5L, 2L, 1L, 3L, 
7L, 1L, 1L), .Dim = c(2L, 8L), .Dimnames = list(c("r1", "r2"), 
    c("a", "b", "c", "d", "e", "f", "g", "h")))

进行列映射:

map = data.frame(old = colnames(m), new = rep(LETTERS, each=4, length.out=ncol(m)))

  old new
1   a   A
2   b   A
3   c   A
4   d   A
5   e   B
6   f   B
7   g   B
8   h   B

然后由它rowsum

res = rowsum(t(m), map$new)

  r1 r2
A  9 16
B  7 14

我们必须在此处使用t转置数据,因为R有rowsum但没有colsum。之后您可以将其转置回来,例如t(res)

答案 1 :(得分:3)

基础R解决方案,假设df是您的数据框:

cols = 8
do.call(cbind, lapply(seq(1, ncols, 4), function(i) rowSums(df[i:(i+3)])))
#    [,1] [,2]
# r1    9    7
# r2   16   14

答案 2 :(得分:0)

如果将原始数据转换为具有4列的矩阵,则可以以矢量化方式执行此操作,然后对其使用rowSums,然后将其转换回以匹配原始数据帧的行。这是一个长命令

    df <- read.table(header = TRUE, text = "a  b  c  d  e  f  g  h
            3  2  3  1  1  2  3  1
                1  6  1  8  5  1  7  1")

    matrix(rowSums(matrix(as.vector(t(as.matrix(df))),
         ncol = 4, byrow = TRUE)), ncol = ncol(df) / 4, byrow = TRUE)

    #      [,1] [,2]
    #[1,]    9    7
    #[2,]   16   14

编辑:保留行名称,例如rownames(df) <- c("r1", "r2"),只需将它们应用于生成的矩阵(保留行顺序),即运行rownames(result) <- rownames(df)

答案 3 :(得分:0)

另一种方式:

df <- data.frame(t(matrix(colSums(matrix(t(df), nrow=4)),nrow=nrow(df))))
##  X1 X2
##1  9  7
##2 16 14
  1. 首先将数据转置为4 x (ncol(df)/4 * now(df))矩阵,现在每个列都是原始数据框中每行的四列组。
  2. 使用colSums
  3. 对每列进行求和
  4. 将数据转置回具有原始行数的数据框