我在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
有没有解决方法,所以我不必独立编写每对代码?
谢谢!
答案 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))