R-如何计算行数不同的日期之间的值差异
我的数据如下例所示R-如何计算行数不同的日期之间的值差异,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我的数据如下例所示 #一个tible:18x4 日期作者产品销售 1 2019-11-27詹姆斯B 80 2 2019-11-28詹姆斯B 100 3 2019-11-27詹姆斯A 80 4 2019-11-28詹姆斯A 100 5 2019-11-26弗兰克B 70 6 2019-11-27弗兰克B 75 7 2019-11-28弗兰克B 65 8 2019-11-26弗兰克A 70 9 2019-11-27弗兰克A 75 10 2019-11-28弗兰克A 65 11 2019-11-25玛
#一个tible:18x4
日期作者产品销售
1 2019-11-27詹姆斯B 80
2 2019-11-28詹姆斯B 100
3 2019-11-27詹姆斯A 80
4 2019-11-28詹姆斯A 100
5 2019-11-26弗兰克B 70
6 2019-11-27弗兰克B 75
7 2019-11-28弗兰克B 65
8 2019-11-26弗兰克A 70
9 2019-11-27弗兰克A 75
10 2019-11-28弗兰克A 65
11 2019-11-25玛丽A 100
12 2019-11-26玛丽A 80
13 2019-11-27玛丽A 95
14 2019-11-28玛丽A 110
15 2019-11-25玛丽B 100
16 2019-11-26玛丽B 80
17 2019-11-27玛丽B 95
18 2019-11-28玛丽B 110
我想添加一个“DIFF”列,其中按作者分组计算销售日差异。我的问题如下:
- 对于每个作者,我有不同的行数李>
- 某些作者可以重复相同的日期来报告不同的信息(在本例中为PRODUCT),但销售价值将始终保持不变,因为它只取决于日期和作者
- 我必须保留数据集中的每一行,因为每一行都包含特定的信息,所以我不能只删除日期重复的行
- 理想情况下,我会在脚本中使用一个循环函数来实现整个过程
#一个tible:18x4
日期作者产品销售差异
2019年11月27日詹姆斯B 80
2 2019-11-28詹姆斯B 100 20
3 2019-11-27詹姆斯A 80
4 2019-11-28詹姆斯A 100 20
5 2019-11-26弗兰克B 70
6 2019-11-27弗兰克B 75 5
7 2019-11-28弗兰克B 65-10
8 2019-11-26弗兰克A 70
9 2019-11-27弗兰克A 75 5
10 2019-11-28弗兰克A 65-10
11 2019-11-25玛丽A 100
12 2019-11-26玛丽A 80-20
13 2019-11-27玛丽A 95 15
14 2019-11-28玛丽A 110 15
15 2019-11-25玛丽B 100
16 2019-11-26玛丽B 80-20
17 2019-11-27玛丽B 95 15
18 2019-11-28玛丽B 110 15
我用dplyr
和mutate
尝试了不同的方法,但似乎没有任何效果。有人有什么建议吗
谢谢大家! 您可以使用lag
按组减去以前的值
library(dplyr)
df %>% group_by(AUTHOR, PRODUCT) %>% mutate(diff = SALES - lag(SALES))
# DATE AUTHOR PRODUCT SALES diff
# <fct> <fct> <fct> <int> <int>
# 1 2019-11-27 James B 80 NA
# 2 2019-11-28 James B 100 20
# 3 2019-11-27 James A 80 NA
# 4 2019-11-28 James A 100 20
# 5 2019-11-26 Frank B 70 NA
# 6 2019-11-27 Frank B 75 5
# 7 2019-11-28 Frank B 65 -10
# 8 2019-11-26 Frank A 70 NA
# 9 2019-11-27 Frank A 75 5
#10 2019-11-28 Frank A 65 -10
#11 2019-11-25 Mary A 100 NA
#12 2019-11-26 Mary A 80 -20
#13 2019-11-27 Mary A 95 15
#14 2019-11-28 Mary A 110 15
#15 2019-11-25 Mary B 100 NA
#16 2019-11-26 Mary B 80 -20
#17 2019-11-27 Mary B 95 15
#18 2019-11-28 Mary B 110 15
数据
df <- structure(list(DATE = structure(c(3L, 4L, 3L, 4L, 2L, 3L, 4L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("2019-11-25",
"2019-11-26", "2019-11-27", "2019-11-28"), class = "factor"),
AUTHOR = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L,
1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Frank",
"James", "Mary"), class = "factor"), PRODUCT = structure(c(2L,
2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L), .Label = c("A", "B"), class = "factor"), SALES = c(80L,
100L, 80L, 100L, 70L, 75L, 65L, 70L, 75L, 65L, 100L, 80L,
95L, 110L, 100L, 80L, 95L, 110L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18"))
df我们可以使用shift
fromdata.table
library(data.table)
setDT(df)[, diff := SALES - shift(SALES), .(AUTHOR, PRODUCT)][]
library(data.table)
setDT(df)[, diff := SALES - shift(SALES), .(AUTHOR, PRODUCT)][]