我对以下(简单)问题感到困惑,但无法找到一个好的解决方案。考虑如下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()似乎没有这样做。
答案 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的答案类似),您可以使用head
和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)
答案 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