dplyr获得分组差异的方法

时间:2017-10-09 16:10:53

标签: r dplyr

我正在试图找出分组差异的dplyr方法。

以下是一些假数据:

>crossing(year=seq(1,4),week=seq(1,3)) %>% 
  mutate(value = c(rep(4,3),rep(3,3),rep(2,3),rep(1,3)))

    year  week value
   <int> <int> <dbl>
 1     1     1     4
 2     1     2     4
 3     1     3     4
 4     2     1     3
 5     2     2     3
 6     2     3     3
 7     3     1     2
 8     3     2     2
 9     3     3     2
10     4     1     1
11     4     2     1
12     4     3     1

我想要的是1年级2年级,2年级3年级和3年级4年级。结果如下所示。

    year  week diffs
   <int> <int> <dbl>
 1     1     1     1
 2     1     2     1
 3     1     3     1
 4     2     1     1
 5     2     2     1
 6     2     3     1
 7     3     1     1
 8     3     2     1
 9     3     3     1

编辑:

我道歉。我试图做一个简单的代表,但我搞砸了很多。

请告诉我正确的礼仪是什么。我不想惹恼任何羽毛。

  1. 我不知道-diff()是一个功能。我实际上寻找的是百分比差异((新旧)/旧)* 100,我无法找到使用diff来获得该值的直接方式。

  2. 我从最大的一年开始。我在上面的代码中添加了arrange(desc(year))。我会修剪最小的year而不是最大的。{/ p>

  3. 如果此编辑值得单独提问,请告诉我。

3 个答案:

答案 0 :(得分:3)

如果您每周都没有错过年份:

df %>% 
    arrange(year) %>%
    group_by(week) %>% 
    mutate(diffs = value - lead(value)) %>% 
    na.omit() %>% select(-value)

# A tibble: 9 x 3
# Groups:   week [3]
#   year  week diffs
#  <int> <int> <dbl>
#1     1     1     1
#2     1     2     1
#3     1     3     1
#4     2     1     1
#5     2     2     1
#6     2     3     1
#7     3     1     1
#8     3     2     1
#9     3     3     1

答案 1 :(得分:2)

你可以使用diff,但它需要调整,因为它会减去另一种方式,并返回一个比传递的更短的向量:

library(tidyverse)

diffed <- crossing(year = seq(1,4), 
                   week = seq(1,3)) %>% 
    mutate(value = rep(4:1, each = 3)) %>% 
    group_by(week) %>% 
    mutate(value = c(-diff(value), NA)) %>% 
    drop_na(value)

diffed
#> # A tibble: 9 x 3
#> # Groups:   week [3]
#>    year  week value
#>   <int> <int> <int>
#> 1     1     1     1
#> 2     1     2     1
#> 3     1     3     1
#> 4     2     1     1
#> 5     2     2     1
#> 6     2     3     1
#> 7     3     1     1
#> 8     3     2     1
#> 9     3     3     1

答案 2 :(得分:0)

使用dplyrdo

library(dplyr)
df %>% group_by(week) %>% do(cbind(.[-nrow(.),1:2],diffs=-diff(.$value)))

# # A tibble: 9 x 3
# # Groups:   week [3]
#    year  week diffs
#   <int> <int> <dbl>
# 1     1     1     1
# 2     2     1     1
# 3     3     1     1
# 4     1     2     1
# 5     2     2     1
# 6     3     2     1
# 7     1     3     1
# 8     2     3     1
# 9     3     3     1