我有一个可能是基本的问题,但是我真的很难找到解决方案。我正在制作一个报告,每个月应使用新的日期和值进行更新。我需要能够动态选择要进行计算的列,但似乎无法通过向量来完成。有人可以解释我的想法哪里错了吗?
我有一个这样的数据框:
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 :(得分:2)
获得所需结果的一种方法是收集数据,按组计算差异,然后使用散布将其整形为宽格式:
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