R - group_by n_distinct进行总结

时间:2015-06-26 15:27:53

标签: 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)?

2 个答案:

答案 0 :(得分:3)

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

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

我们可以看到大数据上的独特作品非常糟糕,所以最快的是:

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

答案 1 :(得分:2)

基础套餐:

aggregate(id ~ sex, dta, function(x) length(unique(x))) 

输出:

  sex id
1   F  3
2   M  3

dplyr的另一种选择:

library(dplyr) 
count_(unique(dta), vars = "sex") 

输出:

Source: local data frame [2 x 2]

  sex n
1   F 3
2   M 3

使用sqldf

library(sqldf)
sqldf("SELECT sex, COUNT(DISTINCT(id)) AS n 
      FROM dta GROUP BY sex")

输出:

  sex n
1   F 3
2   M 3