Разделите последний ряд в каждом ряду моих столбцов - PullRequest
0 голосов
/ 01 февраля 2020

Это мой фрейм данных:

    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

Ответы [ 2 ]

3 голосов
/ 01 февраля 2020

Мы можем использовать:

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)
1 голос
/ 01 февраля 2020

Мы можем использовать 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)
...