Динамические имена столбцов в R - PullRequest
0 голосов
/ 31 октября 2018

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

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

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

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

1 Ответ

0 голосов
/ 31 октября 2018

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

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
...