R colSum每两行两个

时间:2013-07-09 10:40:33

标签: r dataframe

我对以下(简单)问题感到困惑,但无法找到一个好的解决方案。考虑如下df:

test<-c("A","B","C","D","E","F")
test2<-sample(1:6)
test3<-data.frame(test,test2)

我想要第三列,第二行显示第2列第1行:第2列的比例,在第四行第3列第3列:第2列第2列比例第5列:第2列。我的df远远大,否则我会手工完成:) 有关如何做到这一点的任何建议?我知道你可以用diff命令获得差异,但比率是多少?我如何将行绑定在一起? split()似乎没有这样做。

3 个答案:

答案 0 :(得分:1)

这应该非常快:

test3$ratio <- NA
test3$ratio[c(FALSE, TRUE)] <- test3$test2[c(FALSE, TRUE)] /
                               test3$test2[c(TRUE, FALSE)]

答案 1 :(得分:0)

您可以使用gl生成论坛:

temp <- within(test3, {
  Sums <- ave(test2, gl(nrow(test3)/2, 2), FUN = function(x) x[2]/x[1])
  Sums[c(TRUE, FALSE)] <- NA
})

temp
#   test test2     Sums
# 1    A     2       NA
# 2    B     6 3.000000
# 3    C     3       NA
# 4    D     4 1.333333
# 5    E     1       NA
# 6    F     5 5.000000

或者(和flodel的答案类似),您可以使用headtail

test3$Sums <- NA
test3$Sums[c(FALSE, TRUE)] <- (tail(c(0, test3$test2), -1)/
                                head(c(0, test3$test2), -1))[c(FALSE, TRUE)]
test3
#   test test2     Sums
# 1    A     2       NA
# 2    B     6 3.000000
# 3    C     3       NA
# 4    D     4 1.333333
# 5    E     1       NA
# 6    F     5 5.000000

对于上述情况,样本数据为:

set.seed(1)
test<-c("A","B","C","D","E","F")
test2<-sample(1:6)
test3<-data.frame(test,test2)

答案 2 :(得分:0)

使用循环(而不是下面的6可以将最后一行的数量放在大数据帧中):

 for( i in seq(2,6,by=2)) {
test3$ratio[i] <- with(test3,test2[i-1]/test2[i])
}
> test3


   test test2     ratio
1    A     3        NA
2    B     5 0.6000000
3    C     4        NA
4    D     6 0.6666667
5    E     1        NA
6    F     2 0.5000000