【问题标题】:How can I count the number of grouped pairs in which one row's column value is greater than another?如何计算一行的列值大于另一行的列值的分组对数?
【发布时间】:2020-06-05 10:53:56
【问题描述】:

我有一个包含多个配对值的数据集 (df1)。一对中的一行是一年(例如,2014),另一行是不同的年份(例如,2013)。对于每一对是 G 列中的一个值。我需要计算其中较高年份的 G 值小于较低年份的 G 值的对数。

这是我对数据集 df1 的输入:

structure(list(Name = c("A.J. Ellis", "A.J. Ellis", "A.J. Pierzynski", 
"A.J. Pierzynski", "Aaron Boone", "Adam Kennedy", "Adam Melhuse", 
"Adrian Beltre", "Adrian Beltre", "Adrian Gonzalez", "Alan Zinter", 
"Albert Pujols", "Albert Pujols"), Age = c(37, 36, 37, 36, 36, 
36, 36, 37, 36, 36, 36, 37, 36), Year = c(2018, 2017, 2014, 2013, 
2009, 2012, 2008, 2016, 2015, 2018, 2004, 2017, 2016), Tm = c("SDP", 
"MIA", "TOT", "TEX", "HOU", "LAD", "TOT", "TEX", "TEX", "NYM", 
"ARI", "LAA", "LAA"), Lg = c("NL", "NL", "ML", "AL", "NL", "NL", 
"ML", "AL", "AL", "NL", "NL", "AL", "AL"), G = c(66, 51, 102, 
134, 10, 86, 15, 153, 143, 54, 28, 149, 152), PA = c(183, 163, 
362, 529, 14, 201, 32, 640, 619, 187, 40, 636, 650)), row.names = c(NA, 
13L), class = "data.frame")

这是一个显示要检查的行的外观的 tibble: https://www.dropbox.com/s/3nbfi9le568qb3s/grouped-pairs.png?dl=0

这是我用来创建小标题的代码:

df1 %>%
  group_by(Name) %>%
  filter(n() > 1)

【问题讨论】:

    标签: r group-by


    【解决方案1】:

    我们可以通过NameAgearrange 数据,并检查G 中的last 值是否小于每个namefirst 值,并用sum 计算这些出现次数。

    library(dplyr)
    df %>%
      arrange(Name, Age) %>%
      group_by(Name) %>%
      summarise(check = last(G) < first(G)) %>%
      pull(check) %>%
      sum(., na.rm = TRUE)
    
    #[1] 2
    

    如果您想要较高年份的 G 值小于较低年份的 G 值的对,我们可以使用 filter

    df %>%
      arrange(Name, Age) %>%
      group_by(Name) %>%
      filter(last(G) < first(G))
    
    # Name              Age  Year Tm    Lg        G    PA
    #  <chr>           <dbl> <dbl> <chr> <chr> <dbl> <dbl>
    #1 A.J. Pierzynski    36  2013 TEX   AL      134   529
    #2 A.J. Pierzynski    37  2014 TOT   ML      102   362
    #3 Albert Pujols      36  2016 LAA   AL      152   650
    #4 Albert Pujols      37  2017 LAA   AL      149   636
    

    【讨论】:

    • Ronak,这些代码行如何产生行数:summarise(check = last(G) &lt; first(G)) %&gt;% pull(check) %&gt;% sum(., na.rm = TRUE)
    • @Metsfan check 是具有TRUE/FALSE 值的逻辑列,我们pull 该列获取向量并使用sum 获取TRUE 值的计数.查看sum(c(TRUE, FALSE, TRUE))sum(c(TRUE, FALSE, TRUE, FALSE, TRUE)) 的输出
    猜你喜欢
    • 2021-10-30
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2020-03-12
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多