【问题标题】:R/dplyr: How do I count the number of unique occurrences of an observation over time without double counting?R/dplyr:如何在不重复计算的情况下计算一次观察的唯一出现次数?
【发布时间】:2020-10-01 09:49:26
【问题描述】:

我有一个类似面板的数据集,随着时间的推移具有相同观察的多个实例。我有一个变量来计算特定公司每年的出现次数(例如,A 公司在 XXXX 年有 10 台活动机器),我还想创建一个变量来计算特定用户曾经拥有的机器数量(即全部-时间计数)。

这是我为此编写的一行代码的示例:

### Creates a column that counts the number of unique machines by company name all time
df_panel <- df_panel %>% group_by(Company_name, Machine_name) %>% summarise(Machine_count_alltime = n())

我遇到的问题是它返回一个像这样的输出表:

Company Name      Machine Name      n     

Company A         Machine Y         1
Company B         Machine X1        1
Company B         Machine X2        1
Company B         Machine Z         2
Company C         Machine K         5
Company C         Machine U         2

在上表中,n 是特定 Machine Name 在整个数据年中出现的次数的计数(例如机器 K 在 5 年中出现)。我想要计算每个 Company Name 多年来作为附加列的唯一机器数量,而不是上表中生成的每个 Machine Name 的实例。它应该看起来像这样:

Company Name      Machine Name           

Company A         Machine Y         1
Company B         Machine X1        3
Company B         Machine X2        3
Company B         Machine Z         3
Company C         Machine K         2
Company C         Machine U         2

我只将Machine Name 列包含在group_by 中,因为我想确保特定机器不会在总历史计数变量中重复计算。我也尝试过在pipe operators 中使用tally()sum() 之类的命令,但只遇到错误,因为名称是字符,或者没有适用的摘要方法等。我要去吗?关于这个错误的方式?非常感谢任何帮助。

不喜欢包 - dplyrbase R 等我都可以。

【问题讨论】:

  • 您能否编辑您的问题以包含dput(df_panel) 的输出?如果行数很多,也可以dput(head(df_panel))

标签: r group-by dplyr summarize


【解决方案1】:

这会做这项工作吗(使用 dplyr::count() )?

library(tidyverse)
data <- tribble(~"Company Name", ~"Machine Name",
        "Company A", "Machine Y",
        "Company B", "Machine X1",
        "Company B", "Machine X1",
        "Company B", "Machine X1",
        "Company B", "Machine X2",
        "Company B", "Machine X2",
        "Company B", "Machine X2",
        "Company C", "Machine K",
        "Company C", "Machine K",
        "Company C", "Machine U",
        "Company C", "Machine U")

data %>% 
  count(`Company Name`, `Machine Name`)
#> # A tibble: 5 x 3
#>   `Company Name` `Machine Name`     n
#>   <chr>          <chr>          <int>
#> 1 Company A      Machine Y          1
#> 2 Company B      Machine X1         3
#> 3 Company B      Machine X2         3
#> 4 Company C      Machine K          2
#> 5 Company C      Machine U          2

reprex package (v0.3.0) 于 2020-06-11 创建

【讨论】:

    【解决方案2】:

    如果我理解正确,这应该可以:

    library(tidyverse)  
     df_panel %>% group_by(Company_name, Machine_name) %>% 
      summarise(n = length(Machine_name))
    

    【讨论】:

      【解决方案3】:

      第三个选项,因为我不确定正确的输出应该是什么样子:

      library(tidyverse)
      
      df %>%
        group_by(`Company Name`) %>%
        distinct(`Machine Name`) %>%
        mutate(count=n())
      

      【讨论】:

        猜你喜欢
        • 2015-10-28
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 2022-12-08
        • 2014-07-06
        • 1970-01-01
        相关资源
        最近更新 更多