R中的动态列名称

时间:2018-10-31 11:35:25

标签: r dplyr lubridate

我有一个可能是基本的问题,但是我真的很难找到解决方案。我正在制作一个报告,每个月应使用新的日期和值进行更新。我需要能够动态选择要进行计算的列,但似乎无法通过向量来完成。有人可以解释我的想法哪里错了吗?

我有一个这样的数据框:

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 :(得分: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