R/dplyr:如何在不重复计算的情况下计算一段时间内观察值的唯一出现次数?

R/dplyr: How do I count the number of unique occurrences of an observation over time without double counting?

我有一个类似面板的数据集,随着时间的推移,它有多个相同观察结果的实例。我有一个变量来计算特定公司每年的出现次数(例如,公司 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())

我遇到的问题是它 returns 输出 table 像这样:

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

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

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 等对我来说没问题。

这会完成这项工作吗(使用 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

如果我理解正确,这应该有效:

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

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

library(tidyverse)

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