【问题标题】:Performing operation among levels of grouped variable in R/dplyr在 R/dplyr 中的分组变量级别之间执行操作
【发布时间】:2021-02-18 18:00:15
【问题描述】:

我想在分组变量的级别之间执行计算,并将其放入 dplyr/tidyverse 风格的工作流程中。我知道这是令人困惑的措辞,但我希望下面的示例有助于澄清。

下面,我想找出我拥有数据的每一年的“A”和“B”级别之间的差异。一种解决方案是将数据从长格式转换为宽格式,并使用 mutate() 来查找 A 和 B 之间的差异并使用结果创建一个新列。

最终,我正在使用一个更大的数据集,其中对于 N 个物种中的每一个,并且对于每一年的采样,我都想找到一些测量变量的响应比。能够将计算保持在长格式的工作流程中将极大地帮助以后使用数据。



library(tidyverse)
library(reshape)


set.seed(34)

test = data.frame(Year = rep(seq(2011,2020),2),
                  Letter = rep(c('A','B'),each = 10),
                  Response = sample(100,20))





test.results = test %>% 
  cast(Year ~ Letter, value = 'Response') %>% 
  mutate(diff = A - B)

#test.results
   Year  A   B diff
   2011 93  48   45
   2012 33  44  -11
   2013  9  80  -71
   2014 10  61  -51
   2015 50  67  -17
   2016  8  43  -35
   2017 86  20   66
   2018 54  99  -45
   2019 29 100  -71
   2020 11  46  -35

是否有一些解决方案可以按年份分组,然后使用 summarise() 之类的函数来计算变量“Letters”的级别?

group_by(Year)%>%
summarise( "something here to perform a calculation between levels A and B of the variable "Letters")


【问题讨论】:

    标签: r dplyr group-by summarize


    【解决方案1】:

    您可以将Response 的值作为"A""B" 的子集,然后取其差。

    library(dplyr)
    
    test %>%
      group_by(Year) %>%
      summarise(diff = Response[Letter == 'A'] - Response[Letter == 'B'])
    
    #    Year  diff
    #   <int> <int>
    # 1  2011    45
    # 2  2012   -11
    # 3  2013   -71
    # 4  2014   -51
    # 5  2015   -17
    # 6  2016   -35
    # 7  2017    66
    # 8  2018   -45
    # 9  2019   -71
    #10  2020   -35
    

    在这个例子中,我们还可以利用这样一个事实,如果我们 arrange 数据 "A" 将在 "B" 之前,所以我们可以使用 diff

    test %>%
      arrange(Year, desc(Letter)) %>%
      group_by(Year) %>%
      summarise(diff = diff(Response))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2019-05-14
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多