R - 每两行加一个并除以该总和中的第一行

时间:2016-11-30 21:02:19

标签: r

我的数据框如下

      a          b
24    11.67     -1
39     8.14      1
42     8.12      1
90    10.50     -1
137   13.53     -1
405   47.45      1
416   58.11     -1
454   54.13      1
467   47.82      1
500   59.31     -1
508   61.18     -1
598   51.67      1
626   49.86      1
663   58.47     -1
677   64.85     -1
919   91.15      1
926   82.79      1
974  111.51     -1
1024  85.33      1
1103 118.79     -1

所以在这种情况下我想要的是以下列方式的列表:

(11.67*-1+8.14*1)/11.67
(8.12*1+10.50*-1)/8.12
(13.52*-1+47.45*1)/13.53
.
.
.
that is --> 
(a1*b1)+(a2*b2)/a1
(a3*b3)+(a4*b4)/a3
.
.
.

我不知道从哪里开始。所以任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

ind_denominator <- seq(1, nrow(dat), by=2)
ind_sum <- rep(ind_denominator, each=2)
tapply(dat$a*dat$b, ind_sum, sum)/dat$a[ind_dividor]

这给了你:

          1           3           5           7           9 
-0.30248500 -0.29310345  2.50702143 -0.06849079 -0.24027604 
         11          13          15          17          19 
-0.15544296 -0.17268351  0.40555127 -0.34690180 -0.39212469

答案 1 :(得分:1)

rowsum()的另一个选项:

with(df, rowsum(a * b / rep(a[c(T, F)], each = 2), (seq_along(a) - 1) %/% 2))

#         [,1]
#0 -0.30248500
#1 -0.29310345
#2  2.50702143
#3 -0.06849079
#4 -0.24027604
#5 -0.15544296
#6 -0.17268351
#7  0.40555127
#8 -0.34690180
#9 -0.39212469

答案 2 :(得分:0)

以下是仅使用(df[seq(1,nrow(df),2),1]*df[seq(1,nrow(df),2),2] + df[seq(2,nrow(df),2),1]*df[seq(2,nrow(df),2),2])/df[seq(1,nrow(df),2),1] 的一行中的不同方法:

a = Enum.to_list(10..1_000_001)
b = Enum.to_list(1..1_000_000)