R - group_by n_distinct 总结
R - group_by n_distinct for summarise
我的数据集是这样的
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
与十字架相同的问题table
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)
基础包:
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
我的数据集是这样的
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
与十字架相同的问题table
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)
基础包:
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