提问人:Sulz 提问时间:2/10/2022 更新时间:2/10/2022 访问量:383
计算组内两个值和给定周期的差值 (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)
因此,我想再次添加一个新列,其中给定时间跨度之间所有国家/地区的值差异。我的数据帧最后应该看起来像以下示例,其中给出了“04-01-2021”和“02-01-2021”之间每个组内值的差异。
因此,在 at 数据帧应该以某种方式如下所示:
df$ValueDif <- c(3,3,3,3, 2,2,2,2,10,10,10,10)
view(df)
感谢您的帮助!
答:
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:我已经在代码中对日期进行了硬编码,以符合您的问题。
编辑为了获得与您要查找的内容相对应的最近日期,您可以使用该库。有一个函数叫做 。它将为您提供最接近的值。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
在上面的例子中,我检查了第二部分中的最近日期,而不是第一部分。您也可以在那里使用相同的语法。
评论
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
我已经根据您的需要编辑了答案。
上一个:计算组内和时间内的百分比差异
评论
df