Разделите данные на предыдущую строку и создайте новый фрейм данных - PullRequest
0 голосов
/ 16 марта 2020

У меня есть набор данных, и я пытаюсь вычислить скорость изменения между строками.

Мой ввод выглядит следующим образом:

foo = structure(list(date = structure(c(5L, 1L, 2L, 3L, 4L), .Label = c("10/03/2020", 
"11/03/2020", "12/03/2020", "13/03/2020", "9/03/2020"), class = "factor"), 
    A = c(0.60256322, 0.634543306, 0.022976661, 0.009839044, 
    0.319456765), B = c(45.42320826, 57.32689951, 32.49487759, 
    29.40804164, 54.33691346), C = c(5.114123914, 3.674167652, 
    2.330610757, 5.510280192, 5.717950467), D = c(4.187409484, 
    4.835943165, 4.340614439, 4.607468576, 3.14338155)), row.names = c(NA, 
5L), class = "data.frame")

Я пытаюсь разделить каждая из следующих ячеек с предыдущей

например. [5,2] / [4,2]; [4,2] / [3,2] ... et c

и я пытаюсь создать новый вывод, подобный этому:

bar = structure(list(date = structure(c(5L, 1L, 2L, 3L, 4L), .Label = c("10/03/2020", 
"11/03/2020", "12/03/2020", "13/03/2020", "9/03/2020"), class = "factor"), 
    A = c(0, 1.053073412, 0.03620976, 0.428219052, 32.46827283
    ), B = c(0, 1.262061878, 0.56683473, 0.90500546, 1.847688946
    ), C = c(0, 0.718435398, 0.634323465, 2.364307371, 1.037687789
    ), D = c(0, 1.154877063, 0.897573501, 1.061478424, 0.682236134
    )), row.names = c(NA, 5L), class = "data.frame")

Я уверен Есть лучший способ, чем найти длину столбца и пройтись по нему. Кто-нибудь может указать мне правильное направление?

Ответы [ 3 ]

0 голосов
/ 16 марта 2020

В базе R мы можем использовать head и tail для разделения данных.

foo[-1] <- lapply(foo[-1], function(x) c(0, tail(x, -1)/head(x, -1)))
foo

#        date           A         B         C         D
#1  9/03/2020  0.00000000 0.0000000 0.0000000 0.0000000
#2 10/03/2020  1.05307341 1.2620619 0.7184354 1.1548771
#3 11/03/2020  0.03620976 0.5668347 0.6343235 0.8975735
#4 12/03/2020  0.42821905 0.9050055 2.3643074 1.0614784
#5 13/03/2020 32.46827283 1.8476889 1.0376878 0.6822361
0 голосов
/ 16 марта 2020

Другой tidyverse подход.

library(tidyverse)

bar <- foo %>% 
  mutate_if(is.double, ~ replace_na(./lag(.), replace = 0))

bar

#>         date           A         B         C         D
#> 1  9/03/2020  0.00000000 0.0000000 0.0000000 0.0000000
#> 2 10/03/2020  1.05307341 1.2620619 0.7184354 1.1548771
#> 3 11/03/2020  0.03620976 0.5668347 0.6343235 0.8975735
#> 4 12/03/2020  0.42821905 0.9050055 2.3643074 1.0614784
#> 5 13/03/2020 32.46827283 1.8476889 1.0376878 0.6822361
0 голосов
/ 16 марта 2020

Вы можете использовать mutate_if или mutate_at из пакета dplyr.

library(dplyr)

foo %>%
    mutate_if(!grepl("date", names(.)), function(x) x/lag(x))

ИЛИ

foo %>%
    mutate_at(vars(-date), function(x) x/lag(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...