У меня есть проблема, которая может быть основной, но где я действительно изо всех сил пытаюсь найти решение. Я делаю отчет, который должен обновляться с новыми датами и значениями каждый месяц. Мне нужно иметь возможность динамически выбирать столбцы для выполнения вычислений, но, кажется, не могу сделать это с помощью векторов. Может кто-нибудь объяснить, где мое мышление не так?
У меня есть такой фрейм данных:
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
Есть идеи, как мне это решить?