Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-如何计算行数不同的日期之间的值差异_R_Dplyr_Tidyverse - Fatal编程技术网

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
from
data.table

library(data.table)
setDT(df)[, diff :=  SALES - shift(SALES), .(AUTHOR, PRODUCT)][]
library(data.table)
setDT(df)[, diff :=  SALES - shift(SALES), .(AUTHOR, PRODUCT)][]