计算组内两个值和给定周期的差值 (R)

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

提问人:Sulz 提问时间:2/10/2022 更新时间:2/10/2022 访问量:383

问:

也许答案在某个地方,但我没有找到。 我的问题是,我想计算组内值的差值,但仅在给定的时间跨度内。(换句话说:我想在例如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)

因此,我想再次添加一个新列,其中给定时间跨度之间所有国家/地区的值差异。我的数据帧最后应该看起来像以下示例,其中给出了“04-01-2021”和“02-01-2021”之间每个组内值的差异。

因此,在 at 数据帧应该以某种方式如下所示:

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

view(df)

感谢您的帮助!

R 差异

评论

0赞 caldwellst 2/10/2022
您的日期仅跨 4 天。如果您有 6 天,例如,如何为特定时间跨度分配天数?df
0赞 Vishal A. 2/10/2022
您是否需要每个国家/地区的最新和最旧日期之间的差异?
0赞 Sulz 2/10/2022
我不确定我是否回答了你的问题。实际上,这些只是我的原始数据有 2.5 年至 2019 年的每日数据的例子,但我只想要 2020 年的日期/值差异。这意味着,价值在一年内上涨了多少。
0赞 Sulz 2/10/2022
@Vishal A.所以我不需要日期的差异,我需要值的差异。而不是最新和最古老的,我需要它到特定日期。但对于每个国家来说,是的!

答:

1赞 Vishal A. 2/10/2022 #1

您可以执行以下操作:

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

PS:我已经在代码中对日期进行了硬编码,以符合您的问题。

编辑为了获得与您要查找的内容相对应的最近日期,您可以使用该库。有一个函数叫做 。它将为您提供最接近的值。birkwhich.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

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

评论

0赞 cgvoller 2/10/2022
这不适用于范围之外的日期 2021-01-01 - 2021-01-04 ?
0赞 Vishal A. 2/10/2022
我已经对日期进行了硬编码,因为问题中提到了这些日期。为了使其动态化,我们可以传递一个变量,而不是传递一个硬编码的值。
0赞 Sulz 2/10/2022
谢谢!这几乎是我需要的!还有一个问题:如果在特定日期没有值,则应取下一个接近值,因此,如果 2021-01-01 没有值,则应取 2021-01-02 等。
0赞 Vishal A. 2/10/2022
我已经根据您的需要编辑了答案。