我在同一数据集中有不同商品的价格清单。
abc1 <- c("2005-09-18", "ABC", 99.00)
abc2 <- c("2005-09-19", "ABC", 98.00)
abc3 <- c("2005-09-20", "ABC", 98.50)
abc4 <- c("2005-09-21", "ABC", 97.75)
def1 <- c("2005-09-14", "DEF", 79.00)
def2 <- c("2005-09-15", "DEF", 78.00)
def3 <- c("2005-09-16", "DEF", 78.50)
def4 <- c("2005-09-20", "DEF", 77.75)
df <- data.frame(rbind(abc1, abc2, abc3, abc4, def1, def2, def3, def4))
上面的快速表将导致:
X1 X2 X3
abc1 2005-09-18 ABC 99
abc2 2005-09-19 ABC 98
abc3 2005-09-20 ABC 98.5
abc4 2005-09-21 ABC 97.75
def1 2005-09-14 DEF 79
def2 2005-09-15 DEF 78
def3 2005-09-16 DEF 78.5
def4 2005-09-20 DEF 77.75
我想添加一列,例如X4,这是针对特定X2的今天相对于前一天的变化。因此x4将具有以下值:
X4
0,0%
-1,0%
0,5%
-0,8%
0,0%
-1,3%
0,6%
-1,0%
目标是对X3中的所有不同项目执行此操作。理想情况下,不拆分表。我认为日期总会保持正确的顺序,但以防万一。
答案 0 :(得分:3)
我们可以按'X2'分组,并用diff
来计算相邻元素的差值
library(dplyr)
df %>%
group_by(X2) %>%
mutate(X4 = c(0, diff(X3)))
或按“ X2”分组后,取“ X2”和“ X2”的lag
之间的差值
df %>%
group_by(X2) %>%
mutate(X4 = X3 - lag(X3, default = first(X3)))
答案 1 :(得分:2)
只需一点提示:您想计算百分比差异,而不是绝对差异。
您必须调整公式才能这样做,否则您的结果是错误的:-)。
df %>%
dplyr::group_by(X2) %>%
dplyr::mutate(X4 = (X3/lag(X3, default = first(X3)) - 1) * 100)
X1 X2 X3 X4
<fct> <fct> <dbl> <dbl>
1 2005-09-18 ABC 99 0
2 2005-09-19 ABC 98 -1.01
3 2005-09-20 ABC 98.5 0.510
4 2005-09-21 ABC 97.8 -0.761
5 2005-09-14 DEF 79 0
6 2005-09-15 DEF 78 -1.27
7 2005-09-16 DEF 78.5 0.641
8 2005-09-20 DEF 77.8 -0.955