在我的列的每一行中划分最后一行

Divide last row in each row of my columns

这是我的数据框:

    Deta <- c("2010-01-29" , "2015-01-29", "2017-01-30")
    v <- c(5.1, 3, 4)
    a <- c(4.3, 2, 6)
    z <- data.frame(Deta,v,a)

我想要这个公式的每一行中的 v 列和 a 列(最后一行/第 -1 行)。示例 ( 4 / 5.1 -1) 可以帮助我吗?

我用这个mutate_at(-1, c(z[last(z)])/z-1)但是我有一个错误

这是输出:

    Date           a         v
    2010-01-29  -0.21569  0.3953
    2015-01-29  0.33333   2.0000
    2017-01-30  0.00000   0.00000

我们可以使用:

library(dplyr)
z %>%  mutate_at(-1, ~last(.)/. - 1)
#Can also use 
#z %>%  mutate_at(vars(v, a), ~last(.)/. - 1)

或在基数 R 中:

z[-1] <- lapply(z[-1], function(x) x[length(x)]/x - 1)

我们可以使用data.table

library(data.table)
setDT(z)[, (2:ncol(z)) := lapply(.SD, function(x) last(x)/x - 1), .SDcols = -1]
z
#         Deta          v         a
#1: 2010-01-29 -0.2156863 0.3953488
#2: 2015-01-29  0.3333333 2.0000000
#3: 2017-01-30  0.0000000 0.0000000

或使用base R

z[-1] <-  mapply(`/`, tail(z[-1], 1),  z[-1])-1

或矢量化

z[-1] <- (tail(z[-1], 1)[col(z[-1])]/z[-1] -1)