计算一组和给定时间段内两个值的差值 (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
在上面的例子中,我在第二部分而不是第一部分检查了最近的日期。您也可以在那里使用相同的语法。
可能答案在其他地方,但我没有找到。 我的问题是,我想计算一个组内的值的差异,但只在给定的时间跨度内。(换句话说:我想计算一个国家在例如 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
在上面的例子中,我在第二部分而不是第一部分检查了最近的日期。您也可以在那里使用相同的语法。