[英]R - sum every two rows and divide by the first row in that sum
我有一个数据框如下
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
.
.
.
我不知道从哪里开始。 因此,感谢您的帮助。
您可以执行以下操作:
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
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
这是仅使用seq
的另一种方法:
(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]
子集信息:
http://www.statmethods.net/management/subset.html
https://stat.ethz.ch/R-manual/R-devel/library/base/html/subset.html
https://stat.ethz.ch/R-manual/R-devel/library/base/html/nrow.html
如果您不想在R(*)中执行for循环,那么这是关于子集数据,“:”运算符和seq()或序列运算符的问题。 *循环并不像人们认为的那么糟糕,特别是通过子集计算功能[1]的合理使用(如pratz中的tapply()或集合函数的类似的行)(如inf中的rowsum())。但是,假设您当时不想循环您可以修改如下代码:
mydata <- data.frame(a,b) # #Your data either matrix or data frame format.
# In this case I used vectors or column a and b
indexa <- seq(1,nrow(mydata)-1, by = 2) #we to index a from 1 to 1 minus the last row
indexb <- seq(2,nrow(mydata), by = 2) #we want to index b from 2 to the last row
ans <- (mydata$a[1:indexa]*mydata$b[1:indexa] +
mydata$a[2:indexb]*mydata$b[2:indexb])/(mydata$a[1:indexa])
ans =
[1] -0.30248500 -0.29310345 2.50702143 -0.06849079 -0.24027604 -0.15544296 -0.17268351
[8] 0.40555127 -0.34690180 -0.39212469
希望您可能已经注意到R的一些有趣之处。它的外观与您在SQL,Oracle,Python或Matlab中编写的外观非常相似! 实际上,就语法而言,R的基本包在数学上对SQL,Octave,数字Python和Matlab都是规范的,如果您知道这些语言中的一种,那么就可以理解它们。 由于我怀疑您可能知道另一种编码语言,因此我在R和其他语言之间提供了非常著名的语法同义词库。
http://mathesaurus.sourceforge.net/r-numpy.html
http://mathesaurus.sourceforge.net/octave-r.html
可悲的是,我不认为Java和R是规范的,因为我还没有看到两种语言之间的语法词库。
另外,这里还有一些有关其他两个解决方案提供商发布的功能的链接。 tapply()和rowsum()
https://www.r-bloggers.com/r-function-of-the-day-tapply-2/
https://stat.ethz.ch/R-manual/R-devel/library/base/html/rowsum.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.