【问题标题】:Frequency table from two filters and two summarise in dplyr来自两个过滤器和两个在 dplyr 中汇总的频率表
【发布时间】:2018-04-20 19:53:44
【问题描述】:

如何将以下代码合二为一:

df %>% group_by(year) %>% filter(MIAPRFCD_J8==1 | MIAPRFCD_55==1) %>% summarise (Freq = n()) 


df %>% group_by(year) %>% filter(sum==1 | (MIAPRFCD_J8==1 & MIAPRFCD_55==1)) %>% summarise (reason_lv = n()) 

所以输出将是一个表格(或 df),它根据上述过滤器按年份和两列频率分组。 这是示例数据:

df<- read.table(header=T, text='Act year    MIAPRFCD_J8 MIAPRFCD_55 sum
1   2015    1   0   1
2   2016    1   0   1
3   2016    0   1   2
6   2016    1   1   3
7   2016    0   0   2
9   2015    1   0   1
11  2015    1   0   1
12  2015    0   1   2
15  2014    0   1   1
20  2014    1   0   1
60  2013    1   0   1') 

梳理代码后的输出为:

year Freq reason_lv
2013 1 1
2014 2 2
2015 4 3
2016 3 2

【问题讨论】:

  • “我没有添加我的数据,因为我相信从代码中可以清楚地看到我想要实现的目标。”真的不是。如果您包含您的数据,我们就会知道您拥有哪些类型的变量、您如何加入它们等等。
  • 有group_by(mtcars, am) %&gt;% summarise(n1 = sum(mpg &gt; 20), n2 = sum(disp &lt; 100)),但似乎应该可以使用计数或类似功能...
  • 实际上并不清楚。请始终假设您所做的事情对您的听众来说并不清晰。
  • 同意卡米尔。一般在问dplyr 问题时没有理由不包含数据;如果您不想包含自己的数据,请使用您安装的软件包提供的众多数据集之一(使用data(package = .packages(all.available = TRUE)) 查看所述数据集)。
  • @camille 等人。感谢您的反馈意见。我现在为上述问题添加了一个示例 df。

标签: r dplyr data.table


【解决方案1】:

现在您已经包含了数据,这很容易解决。这里有两个可能的选择。这两个选项都能为您提供所需的输出,这主要只是风格问题。

选项 1,制作 2 个过滤后的数据框,然后使用 inner_join 按年份将它们连接在一起。 (您也可以在 inner_join 的参数中内联构建这些数据帧,但这有点不太清楚。)

library(tidyverse)

df<- read.table(header=T, 
    text='Act year    MIAPRFCD_J8 MIAPRFCD_55 sum
    1   2015    1   0   1
    2   2016    1   0   1
    3   2016    0   1   2
    6   2016    1   1   3
    7   2016    0   0   2
    9   2015    1   0   1
    11  2015    1   0   1
    12  2015    0   1   2
    15  2014    0   1   1
    20  2014    1   0   1
    60  2013    1   0   1') 

# option 1: two dataframes, then join
freq_df <- df %>% 
    group_by(year) %>% 
    filter(MIAPRFCD_J8 == 1 | MIAPRFCD_55 == 1) %>% 
    summarise (Freq = n()) 

reason_df <- df %>% 
    group_by(year) %>% 
    filter(sum == 1 | (MIAPRFCD_J8 == 1 & MIAPRFCD_55 == 1)) %>% 
    summarise (reason_lv = n())

inner_join(freq_df, reason_df, by = "year")
#> # A tibble: 4 x 3
#>    year  Freq reason_lv
#>   <int> <int>     <int>
#> 1  2013     1         1
#> 2  2014     2         2
#> 3  2015     4         3
#> 4  2016     3         2

选项 2,为观察是否需要进入 Freq 计算以及是否需要进入响应计算添加布尔变量 - 虚拟变量对此有所帮助,因为这两者并不相互排斥。

# option 2: binary variables
df %>%
    mutate(getFreq = (MIAPRFCD_J8 == 1 | MIAPRFCD_55 == 1)) %>%
    mutate(getReason = (sum == 1 | (MIAPRFCD_J8 == 1 & MIAPRFCD_55 == 1))) %>%
    group_by(year) %>%
    summarise(Freq = sum(getFreq), reason_lv = sum(getReason))
#> # A tibble: 4 x 3
#>    year  Freq reason_lv
#>   <int> <int>     <int>
#> 1  2013     1         1
#> 2  2014     2         2
#> 3  2015     4         3
#> 4  2016     3         2

由reprex package (v0.2.0) 于 2018 年 4 月 23 日创建。

【讨论】:

  • 我比选项 1 更喜欢选项 2(我试图避免任何加入/合并)。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
相关资源
最近更新 更多