计算一组和给定时间段内两个值的差值 (R)

Calculating the difference of two values within a group and given period (R)

可能答案在其他地方,但我没有找到。 我的问题是,我想计算一个组内的值的差异,但只在给定的时间跨度内。(换句话说:我想计算一个国家在例如 5 天内的值差异)

Country <- c("Germany", "Germany", "Germany", "Germany", "USA", "USA", "USA", "USA", "Canada", "Canada", "Canada", "Canada")
Date = c("2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-01",  "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04")
Value <- c(5,6,7,9,1,3,4,5,0,5,10,15)
df <- data.frame(Country, Date, Value)

所以,我想再次添加一个新列,其中包含给定时间跨度之间所有国家/地区的价值差异。我的 Dataframe 最后应该类似于以下示例,其中给出了“04-01-2021”和“02-01-2021”之间每个组内的值差异。

所以在数据框应该看起来像下面这样:

df$ValueDif <- c(3,3,3,3, 2,2,2,2,10,10,10,10)

view(df)

感谢您的帮助!

您可以进行如下操作:

df$Date <- as.Date(df$Date, format = "%Y-%m-%d")

df1 <- df %>%
  group_by(Country) %>%
  mutate(diffValue = Value[Date == as.Date("2021-01-04")] - Value[Date == as.Date("2021-01-02")])

它会给你这样的输出:

df1
# A tibble: 12 x 4
# Groups:   Country [3]
   Country Date       Value diffValue
   <chr>   <date>     <dbl>     <dbl>
 1 Germany 2021-01-01     5         3
 2 Germany 2021-01-02     6         3
 3 Germany 2021-01-03     7         3
 4 Germany 2021-01-04     9         3
 5 USA     2021-01-01     1         2
 6 USA     2021-01-02     3         2
 7 USA     2021-01-03     4         2
 8 USA     2021-01-04     5         2
 9 Canada  2021-01-01     0        10
10 Canada  2021-01-02     5        10
11 Canada  2021-01-03    10        10
12 Canada  2021-01-04    15        10

P.S:我在代码中硬编码了日期,以符合您的问题。

编辑 为了获得与您要查找的内容相对应的最近日期,您可以使用 birk 库。有一个函数叫做 which.closest。它会给你最接近的值。

代码如下所示:

df1 <- df %>%
  group_by(Country) %>%
  mutate(diffValue = Value[Date == as.Date("2021-01-04")] - 
           Value[Date == as.Date(Date[which.closest(df$Date, as.Date("2020-12-31"))])])

并输出:

# A tibble: 12 x 4
# Groups:   Country [3]
   Country Date       Value diffValue
   <chr>   <date>     <dbl>     <dbl>
 1 Germany 2021-01-01     5         4
 2 Germany 2021-01-02     6         4
 3 Germany 2021-01-03     7         4
 4 Germany 2021-01-04     9         4
 5 USA     2021-01-01     1         4
 6 USA     2021-01-02     3         4
 7 USA     2021-01-03     4         4
 8 USA     2021-01-04     5         4
 9 Canada  2021-01-01     0        15
10 Canada  2021-01-02     5        15
11 Canada  2021-01-03    10        15
12 Canada  2021-01-04    15        15

在上面的例子中,我在第二部分而不是第一部分检查了最近的日期。您也可以在那里使用相同的语法。