2017-06-29 29 views
0

304行と32変数のデータフレームがあります。列Aと列Bの値を2行ごとに合計したいとします(つまり、row1 + row2、row3 + row4、row5 + row6など)。 OUTPUT列には、私が何を得たいかを見ることができます。R列の2列ごとに列を合計する

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))) 

しかし、それは動作しません。どんな提案も非常に高く評価されます。ここ

+0

。あなたはどんなエラーを出していますか? – HFBrowning

+0

@HFBrowning私は以下を取得します: '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' – dede

答えて

2

は、多くの可能な解決策の一つである:ここ

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 
1

tapplyを使用して基地R法およびモジュラス演算子、%%あります。

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

ここで、行の合計を計算しtapplyの第1引数に供給されます。グループ化を実行する2番目の引数は、係数2である行の累積合計として計算されます。この関数は、各グループの合計で連結された0を返します。ここでは、tapplyは、unlistで数値ベクトルに変換されるリストを返します。

結果の最初の6行はrowSums(dat)はあなたの全体のdata.frameの行ごとの加算を実行しようとすること

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 

注意です。 data.frameに2つ以上のカラムがあり、特に操作を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") 
+0

これは私にこのエラーを与えます:' Error in rowSums dat): 'x'は数字でなければならない ' – dede

+0

これは、少なくとも1つの列が数値ではないので、合計を計算するのが意味をなさないことを意味します。これは、あなたが提供したサンプルで動作し、私の答えの最後に読み込まれ、提供されます(期待される出力の3番目の列を削除します)。 – lmo

+0

はい、2つの列のうちの1つは数値で、もう1つの整数は数値です。 – dede

関連する問題