R - group_by n_distinct 总结

标签 r unique dplyr

我的数据集是这样的

library(dyplr) 

dta = rbind(c(1,'F', 0), 
  c(1,'F', 0), 
  c(1,'F', 0), 
  c(2,'F', 1), 
  c(2,'F', 1), 
  c(3,'F', 1), 
  c(3,'F', 1), 
  c(3,'F', 1), 
  c(4,'M', 1), 
  c(4,'M', 1), 
  c(5,'M', 1), 
  c(6,'M', 0)
)

colnames(dta) <- c('id', 'sex', 'child')
dta = as.data.frame(dta)

所以数据是长格式的,以id作为个人标识符。

我的问题是当我尝试计算性别时,例如, 由于 id 重复,我的计数不正确。

所以有 3 名女性和 3 名男性。

但是当我数数的时候我有

dta %>% 
  group_by(sex) %>% 
  summarise(n())

8 和 4 - 因为它计算的是行数而不是唯一的 id

交叉表同样的问题

dta %>% 
  group_by(sex, child) %>% 
  summarise(n())

如何在计数中指示唯一标识符 (n_distinct)?

最佳答案

有很多不同的方法可以做到这一点,这里是一个:

dta %>% distinct(id) %>%
        group_by(sex) %>%
        summarise(n())

编辑:经过一些讨论,让我们测试一下快速变化的方法的工作情况。

首先,一些更大的数据:

dta <- data.frame(id = rep(1:500, 30),
                  sex = rep (c("M", "F"), 750),
                  child = rep(c(1, 0, 0, 1), 375))

现在让我们运行我们不同的方法:

library(microbenchmark)

microbenchmark(
    distinctcount = dta %>% distinct(id) %>% count(sex),
    uniquecount = dta %>% unique %>% count(sex),
    distinctsummarise = dta %>% distinct(id) %>% group_by(sex) %>% summarise(n()),
    uniquesummarise = dta %>% unique %>% group_by(sex) %>% summarise(n()),
    distincttally= dta %>% distinct(id) %>% group_by(sex) %>% tally
)

在我的机器上:

Unit: milliseconds
              expr       min        lq      mean    median        uq       max neval
     distinctcount  1.576307  1.602803  1.664385  1.630643  1.670195  2.233710   100
       uniquecount 32.391659 32.885479 33.194082 33.072485 33.244516 35.734735   100
 distinctsummarise  1.724914  1.760817  1.815123  1.792114  1.830513  2.178798   100
   uniquesummarise 32.757609 33.080933 33.490001 33.253155 33.463010 39.937194   100
     distincttally  1.618547  1.656947  1.715741  1.685554  1.731058  2.383084   100

我们可以看到 unique 在更大的数据上效果很差,所以最快的是:

dta %>% distinct(id) %>% count(sex)

关于R - group_by n_distinct 总结,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076975/

相关文章:

通过 dplyr group_by 运行列表并每次进行总结和变异

R 映射 : how do I fill the regions?

javascript - HTMLWidget : Shiny app run well in Rstudio but Not on Shiny-Server

r - R 中 lapply 函数中的意外内存地址分配

postgresql - 如何在 PostgreSQL 数据库中声明范围重叠约束?

java - 如何计算唯一字符(仅字母和数字)

javascript indexOf Array在浏览器上的不同结果

r - 使用 dplyr 过滤 postgreSQL 数据库中的多个值

r - 根据 dplyr 中多个数据帧中的值将列添加到数据帧

r - 列 "rate"的长度必须为 1(汇总值),而不是 22906