我有以下输入数据框:
df1 <- data.frame(row.names=c("AA","BB","CC","DD","EE"), A=c(0.90,0.75,0.65,0.55,0.45), B=c(0.80,0.75,0.60,0.60,0.45))
Row A B
AA 0.90 0.80
BB 0.75 0.75
CC 0.65 0.60
DD 0.55 0.60
EE 0.45 0.45
有没有办法将行AA中的值除以行BB中的值(0.90 / 0.75 = 1.200)。然后,我希望将行BB中的这个新值除以行CC(1.2 / 0.65 = 1.846)等中的值,以产生以下输出数据帧:
Row A B
A 0.900 1.067
B 1.200 1.067
C 1.846 1.778
D 3.357 2.963
E 7.459 6.584
我真的对这个问题感到头疼,所以非常感谢任何帮助。
谢谢你们!
答案 0 :(得分:3)
您可以使用简单的for
循环或cumprod
:
df2 <- df1
for (i in 2:nrow(df2)) {
df2[i, ] <- df2[i-1,]/df2[i,]
}
根据您的列数,cumprod
方法应该更快:
df3 <- df1
df3$A <- cumprod(c(df3[1, "A"], 1/df3[-1, "A"]))
df3$B <- cumprod(c(df3[1, "B"], 1/df3[-1, "B"]))
all.equal(df2, df3)
# TRUE
答案 1 :(得分:2)
我会在每列使用Reduce
,accumulate = TRUE
as.data.frame(lapply(df1, Reduce, f = `/`, accumulate = TRUE))
(行名中丢失了行名,但我敢打赌你会知道怎样做才能让他们回来。)