首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每组n行和n-2行之间的差异

每组n行和n-2行之间的差异
EN

Stack Overflow用户
提问于 2018-04-29 23:58:22
回答 4查看 74关注 0票数 4

我想确定每组每n行和n-2行之间的差值的计算方法。假设下面是我的数据:

代码语言:javascript
复制
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行之间的差值,并根据每个组的每月数据找到每个组的结果。

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2018-04-30 00:05:10

使用dplyr::lag函数,您可以执行以下操作

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
t <- "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"

df <- read.table(text = t, header = T, sep = ",", strip.white = TRUE)
票数 5
EN

Stack Overflow用户

发布于 2018-04-30 00:45:26

您可以结合使用dplyrdiff函数来获得所需的输出。

代码语言:javascript
复制
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

数据:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2018-04-30 00:32:52

您可以使用n()来访问dplyr中的组的最后一个行号,以及data.table中的等效.N

代码语言:javascript
复制
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

使用data.table

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50088564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档