R 每组n行和n-2行之间的差异
我想为每个组确定计算每n行和n-2行之间差异的方法。假设下面是我的数据:R 每组n行和n-2行之间的差异,r,R,我想为每个组确定计算每n行和n-2行之间差异的方法。假设下面是我的数据: Month, Laptop, Sales Jan, HP, 1000 Feb, HP, 2000 Mar, HP, 1300 April, HP, 5000 Jan, Samsung, 1200 Feb, Samsung, 2500 Mar, Samsung, 1100 April, Samsung, 4500 现在,我需要下面这样的输出,在这里,我计算每n行和n-2行之间的差值,并根据每个组的每月数据查找结果 Mont
Month, Laptop, Sales
Jan, HP, 1000
Feb, HP, 2000
Mar, HP, 1300
April, HP, 5000
Jan, Samsung, 1200
Feb, Samsung, 2500
Mar, Samsung, 1100
April, Samsung, 4500
现在,我需要下面这样的输出,在这里,我计算每n行和n-2行之间的差值,并根据每个组的每月数据查找结果
Month, Laptop, Sales, difference
Jan, HP, 1000 , NA
Feb, HP, 2000 , NA
Mar, HP, 1300 , 300
April, HP, 5000 , 3000,
Jan, Samsung, 1200 , NA
Feb, Samsung, 2500 , NA
Mar, Samsung, 1100 , -100
April, Samsung, 4500 , 2000
使用
dplyr::lag
函数,您可以
df <- df %>%
group_by(Laptop) %>%
mutate(difference = Sales - lag(Sales, 2))
df
# # A tibble: 8 x 4
# # Groups: Laptop [2]
# Month Laptop Sales difference
# <chr> <chr> <int> <int>
# 1 Jan HP 1000 NA
# 2 Feb HP 2000 NA
# 3 Mar HP 1300 300
# 4 April HP 5000 3000
# 5 Jan Samsung 1200 NA
# 6 Feb Samsung 2500 NA
# 7 Mar Samsung 1100 -100
# 8 April Samsung 4500 2000
df%
分组人(笔记本电脑)%>%
变异(差异=销售-滞后(销售,2))
df
##A tibble:8 x 4
##小组:笔记本电脑[2]
#当月笔记本电脑销售差异
#
#1月1日HP 1000北美
#2000年2月2日北美
#3月3日HP 1300 300
#4月4日HP 5000 3000
#1月5日韩国
#2006年2月6日星期二
#3月7日三星1100-100
#2000年4月8日三星4500
资料
t您可以使用n()
来访问dplyr中组的最后一行号,以及data.table中的等效.n
library(dplyr)
df %>%
group_by(Laptop) %>%
mutate(difference = c(NA,NA,Sales[3:n()]) - c(NA,NA,Sales[1:(n()-2)]) )
# A tibble: 8 x 4
# Groups: Laptop [2]
Month Laptop Sales difference
<fctr> <fctr> <int> <int>
1 Jan HP 1000 NA
2 Feb HP 2000 NA
3 Mar HP 1300 300
4 April HP 5000 3000
5 Jan Samsung 1200 NA
6 Feb Samsung 2500 NA
7 Mar Samsung 1100 -100
8 April Samsung 4500 2000
library(data.table)
setDT(df)[,.(difference = c(NA,NA,Sales[3:.N]) - c(NA,NA,Sales[1:(.N-2)]) ), by = Laptop]
Laptop difference
1: HP NA
2: HP NA
3: HP 300
4: HP 3000
5: Samsung NA
6: Samsung NA
7: Samsung -100
8: Samsung 2000
可以使用diff
功能和dplyr
获得所需的输出
lag = 2
df %>% group_by(Laptop) %>%
mutate(difference = c(rep(NA,lag), diff(Sales, lag)))
# # A tibble: 8 x 4
# # Groups: Laptop [2]
# Month Laptop Sales difference
# <chr> <chr> <int> <int>
# 1 Jan HP 1000 NA
# 2 Feb HP 2000 NA
# 3 Mar HP 1300 300
# 4 April HP 5000 3000
# 5 Jan Samsung 1200 NA
# 6 Feb Samsung 2500 NA
# 7 Mar Samsung 1100 - 100
# 8 April Samsung 4500 2000
lag=2
df%%>%group_by(笔记本电脑)%%>%
变异(差异=c(代表(NA,滞后),差异(销售,滞后)))
##A tibble:8 x 4
##小组:笔记本电脑[2]
#当月笔记本电脑销售差异
#
#1月1日HP 1000北美
#2000年2月2日北美
#3月3日HP 1300 300
#4月4日HP 5000 3000
#1月5日韩国
#2006年2月6日星期二
#3月7日三星1100-100
#2000年4月8日三星4500
数据:
df <- read.table(text =
"Month, Laptop, Sales
Jan, HP, 1000
Feb, HP, 2000
Mar, HP, 1300
April, HP, 5000
Jan, Samsung, 1200
Feb, Samsung, 2500
Mar, Samsung, 1100
April, Samsung, 4500",
header = TRUE, sep = ",", strip.white = TRUE, stringsAsFactors = FALSE)
基本R中的dfdf:
df$difference <- unlist(tapply(df$Sales,df$Laptop,function(x) c(NA,NA,diff(x,2))))
# Month Laptop Sales difference
# 1 Jan HP 1000 NA
# 2 Feb HP 2000 NA
# 3 Mar HP 1300 300
# 4 April HP 5000 3000
# 5 Jan Samsung 1200 NA
# 6 Feb Samsung 2500 NA
# 7 Mar Samsung 1100 -100
# 8 April Samsung 4500 2000
df$差异可能重复
df$difference <- unlist(tapply(df$Sales,df$Laptop,function(x) c(NA,NA,diff(x,2))))
# Month Laptop Sales difference
# 1 Jan HP 1000 NA
# 2 Feb HP 2000 NA
# 3 Mar HP 1300 300
# 4 April HP 5000 3000
# 5 Jan Samsung 1200 NA
# 6 Feb Samsung 2500 NA
# 7 Mar Samsung 1100 -100
# 8 April Samsung 4500 2000