【问题标题】:Sum columns every two rows in RR中每两行求和列
【发布时间】:2017-06-29 17:37:32
【问题描述】:

我有一个包含 304 行和 32 个变量的数据框。我想对每 2 行的 A 列和 B 列的值求和(即 row1+row2、row3+row4、row5+row6 等)。在 OUTPUT 列中,您可以看到我想要获得的内容。

 A      B   OUTPUT  
 0      23  0       #row1
 1000   0   1023    #row2
 0      12  0       #row3
 914    0   926     #row4
 0      25  0       #row5
 502    0   527     #row6
 0      16  0       #row7
 644    0   660     #row8
 0      23  0       #row9
 776    0   799     #row10
 0      19  0       #row11
 860    0   879     #row12
 0      25  0       #row13
 992    0   1017    #row14
 0      15  0       #row15
 1153   0   1168    #row16
 0      17  0       #row17
 615    0   632     #row18
 0      32  0       #row19
 588    0   620     #row20
 0      36  0       #row21
 814    0   850     #row22
 0      29  0       #row23
 1103   0   1132    #row24
 0      16  0       #row25
 690    0   706     #row26
 0      22  0       #row27
 456    0   478     #row28
 0      16  0       #row29
 1292   0   1308    #row30

我尝试过使用:

 library(RcppRoll)
 df1$OUTPUT <- with(df1, round(roll_sumr((df1$A + df1$B), n = 2, by=2,  fill = 0)))

但它不起作用。任何建议将不胜感激。

【问题讨论】:

  • 你的方法对我有用。你遇到了什么错误?
  • @HFBrowning 我得到:0 1023 479 926 289 527 276 660 364 799 542 879 539 1017 602 1168 403 632 535 620 424 850 585 1132 499 706 286 478 800 1308

标签: r sum row


【解决方案1】:

这是许多可能的解决方案之一:

df1 <- structure(list(A = c(0L, 1000L, 0L, 914L, 0L, 502L, 0L, 644L, 
0L, 776L, 0L, 860L, 0L, 992L, 0L, 1153L, 0L, 615L, 0L, 588L, 
0L, 814L, 0L, 1103L, 0L, 690L, 0L, 456L, 0L, 1292L), B = c(23L, 
0L, 12L, 0L, 25L, 0L, 16L, 0L, 23L, 0L, 19L, 0L, 25L, 0L, 15L, 
0L, 17L, 0L, 32L, 0L, 36L, 0L, 29L, 0L, 16L, 0L, 22L, 0L, 16L, 
0L), OUTPUT = c(0L, 1023L, 0L, 926L, 0L, 527L, 0L, 660L, 0L, 
799L, 0L, 879L, 0L, 1017L, 0L, 1168L, 0L, 632L, 0L, 620L, 0L, 
850L, 0L, 1132L, 0L, 706L, 0L, 478L, 0L, 1308L)), .Names = c("A", 
"B", "OUTPUT"), class = "data.frame", row.names = c(NA, -30L))

df1$OUTPUT <- c(0, sapply(2:nrow(df1), function(k) df1$A[k]+df1$B[k-1]))

head(df1)
#      A  B OUTPUT
# 1    0 23      0
# 2 1000  0   1023
# 3    0 12      0
# 4  914  0    926
# 5    0 25      0
# 6  502  0    527

【讨论】:

    【解决方案2】:

    这是使用tapply 和模运算符%% 的基本R 方法。

    dat$temp <- unlist(tapply(rowSums(dat), list(cumsum(seq_len(nrow(dat)) %% 2)),
                              FUN=function(x) c(0, sum(x))))
    

    在这里,计算行总和并将其提供给tapply 的第一个参数。执行分组的第二个参数计算为模数为 2 的行的累积总和。该函数返回与每个组的总和连接的 0。在这里,tapply 返回一个列表,该列表使用unlist 转换为数字向量。

    结果的前六行是

    head(dat)
         A  B temp
    1    0 23    0
    2 1000  0 1023
    3    0 12    0
    4  914  0  926
    5    0 25    0
    6  502  0  527
    

    请注意,rowSums(dat) 将尝试对整个 data.frame 执行逐行求和。如果您的 data.frame 有超过 2 列,并且您希望将操作特别限制为两列,则需要将此参数设置为子集。根据 OP 中的代码,使用名为 df1 的 data.frame,您可以将其替换为 rowSums(df1[c("A", "B")]) 以获得所需的结果。

    数据

        dat <-
        structure(list(A = c(0L, 1000L, 0L, 914L, 0L, 502L, 0L, 644L, 
        0L, 776L, 0L, 860L, 0L, 992L, 0L, 1153L, 0L, 615L, 0L, 588L, 
        0L, 814L, 0L, 1103L, 0L, 690L, 0L, 456L, 0L, 1292L), B = c(23L, 
        0L, 12L, 0L, 25L, 0L, 16L, 0L, 23L, 0L, 19L, 0L, 25L, 0L, 15L, 
        0L, 17L, 0L, 32L, 0L, 36L, 0L, 29L, 0L, 16L, 0L, 22L, 0L, 16L, 
        0L)), .Names = c("A", "B"), row.names = c(NA, -30L), class = "data.frame")
    

    【讨论】:

    • 它给了我这个错误:Error in rowSums(dat) : 'x' must be numeric
    • 这意味着您的至少一列不是数字,因此计算总和没有意义。它适用于您提供的示例,该示例读入并在我的答案末尾提供(删除了预期输出的第三列)。
    • 是的,两列之一是数字,另一列是整数。
    • 整数是数字。您可以使用is.numeric(1L)is.numeric(as.integer(1)) 对此进行测试。该列很可能是字符向量或因子。使用str(my_df) 检查您正在使用的变量类型。如果您的 data.frame 有超过 2 列,您将需要对要执行计算的列进行子集化。在帖子底部形成代码,您需要colSums(df[c("A", "B")]
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多