我的数据集看起来像这样
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
我们可以看到独特的工作在较大的数据上非常糟糕,所以最快的是:
dta %>% distinct(id) %>% count(sex)
关于R - group_by n_distinct 用于汇总,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31076975/