Имена динамических столбцов в r

У меня есть проблема, которая может быть простой, но я действительно изо всех сил пытаюсь найти решение. Я составляю отчет, который должен обновляться каждый месяц новыми датами и значениями. Мне нужно иметь возможность динамически выбирать столбцы для выполнения вычислений, но, похоже, я не могу этого сделать с векторами. Может кто-нибудь объяснить, где я ошибаюсь?

У меня есть такой фрейм данных:

library(lubridate)
library(dplyr)

Dates <- as.Date(c("2018-10-01", "2018-09-01", "2018-08-01", "2018-07-01"))
Value1 <- c(456, 845, 687, 456)
Value2 <- c(895, 547, 123, 632)
df <- data.frame(Date = as.Date(Dates), Value1, Value2)

Я также указываю дату начала двух последних месяцев вот так:

today <- Sys.Date()
fst_in_mth <- floor_date(today, "month")
fst_last_mth <- floor_date(today %m+% months(-1), "month")

Затем я использую эти векторы для фильтрации дат (пока это работает):

df_filtered <- df%>%
  filter(Date %in% c(fst_in_mth, fst_last_mth)) 

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

Date        Value1 Value2
2018-10-01   456    895
2018-09-01   845    547

Здесь у меня проблемы. Я хочу рассчитать разницу между этими двумя месяцами и добавить это в таблицу. Это то, чего я хочу добиться, когда изменения сохраняются в новом столбце:

Date    2018-09-01 2018-10-01 Change
Value1     845        456      -389
Value2     547        895       348

Я транспонирую, чтобы получить таблицу с датами в виде столбцов (я привык делать это по столбцам, но, может быть, мне лучше сделать это со строками?), Но теперь я больше не могу использовать векторы для определения правильных столбцов:

df_ts <- t(df_filtered)
df_result <- df_ts%>%
  mutate(Change = (fst_in_mth - fst_last_mth))

Error in UseMethod("mutate_") : 
no applicable method for 'mutate_' applied to an object of 
class "c('matrix', 'character')" 

Я также получаю сообщение об ошибке, если пытаюсь использовать базу R:

df_ts$Change <- (df_ts$fst_in_mth - df_ts$fst_last_mth)

Error in df_ts$fst_in_mth : $ operator is invalid for atomic vectors

Есть идеи, как я могу это решить?

0
0
497
1

Ответы 1

Один из способов получить желаемый результат - собрать данные, вычислить разницу по группам, а затем использовать распространение, чтобы преобразовать их обратно в широкий формат:

df_filtered %>%
  gather(key, value, -Date) %>%
  group_by(key) %>%
  mutate(Change = diff(-value)) %>%
  spread(key = Date, value = value)

# A tibble: 2 x 4
# Groups:   key [2]
  key    Change `2018-09-01` `2018-10-01`
  <chr>   <dbl>        <dbl>        <dbl>
1 Value1   -389          845          456
2 Value2    348          547          895

возможно, установите diff(value) на diff(-value), чтобы получить точно ожидаемый результат;)

piptoma 31.10.2018 14:23

Спасибо, группировка - определенно правильный способ сделать это, но как мне это сделать, если я хочу получить разницу за несколько дат? В примере я включил только разницу между текущим месяцем и прошлым месяцем, но я также хочу знать разницу между этим месяцем и первым днем ​​года. Итак, есть два столбца изменений: «изменение с прошлого месяца» и «изменение в этом году».

Thomas Tallaksen 01.11.2018 12:07

Возможно, разместите новый вопрос с воспроизводимым примером ваших данных и ожидаемым результатом. Я не совсем уверен, как данные изначально структурированы из вашего комментария.

Ritchie Sacramento 01.11.2018 14:33

Другие вопросы по теме