1

我正在努力解决以下(简单)问题,但找不到一个好的解决方案。考虑如下的df:

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

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

4

3 回答 3

1

这应该很快:

test3$ratio <- NA
test3$ratio[c(FALSE, TRUE)] <- test3$test2[c(FALSE, TRUE)] /
                               test3$test2[c(TRUE, FALSE)]
于 2013-07-09T11:14:39.203 回答
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

或者(类似于弗洛德尔的回答),您可以使用headand tail

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)
于 2013-07-09T10:51:42.257 回答
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
于 2013-07-09T11:06:36.067 回答