计算多对列的比率

时间:2019-02-25 04:58:19

标签: r

我在R中有一个像这样的表:

id  v1  v2  v3
1   115 116 150
2   47  50  55
3   70  77  77

我想将v2 / v1计算为(v2 / v1)-1,v3 / v2计算为(v3 / v2)-1,依此类推(我大约有55个变量,需要获取类似这个:

id  v1  v2  v3  rat1    rat2
1   115 116 150 0.01    0.29
2   47  50  55  0.06    0.10
3   70  77  77  0.10    0.00

有没有解决方法,所以我不必独立编写每对代码?

谢谢!

2 个答案:

答案 0 :(得分:4)

这实际上是在列i和列i+1上的循环,您可以编写一个for循环来这样做。或者用R说,使用Map / mapply之类的矢量化函数:

vars <- paste0("v",1:3)
outs <- paste0("rat",1:2)
dat[outs] <- mapply(`/`, dat[vars[-1]], dat[vars[-length(vars)]]) - 1

dat
#  id  v1  v2  v3        rat1      rat2
#1  1 115 116 150 0.008695652 0.2931034
#2  2  47  50  55 0.063829787 0.1000000
#3  3  70  77  77 0.100000000 0.0000000

答案 1 :(得分:2)

由于我们从开头和结尾删除了相同数量的列('id'共有),因此数据集的维度仍然相似,因此可以直接进行/

dat[paste0("rat", 1:2)] <- 1- dat[-c(1, ncol(dat))]/dat[-(1:2)]

数据

dat <- structure(list(id = 1:3, v1 = c(115L, 47L, 70L), v2 = c(116L, 
50L, 77L), v3 = c(150L, 55L, 77L)), class = "data.frame", row.names = c(NA, 
 -3L))