我有一个351080个观察数据集(转置)看起来像这样:
Subject 1 1 1 2 2 3 3 3 3
nationality G G G D D S S S S
使用:
table(dat$Nationality)
R只返回观察总数。我怎样才能告诉R只选择一个主题的国籍?
答案 0 :(得分:5)
构建数据:
dat <- data.frame(Subject = rep(1:3, each=3),
Nationality = rep(c("G","D","S"), each=3))
试试这个:
with(dat,table(tapply(as.character(Nationality),
list(Subject),head,n=1)))
## D G S
## 1 1 1
with()
查看数据框的上下文,以避免始终键入dat$
tapply()
在由组(head
)分隔的向量(Nationality
)的每个元素上运行指定的函数(list(Subject)
),并带有可选参数({{1}只占第一个元素)。 n=1
很丑,但阻止R将因子转换为数字代码。as.character()
计算表格。你也可以试试这个:
table
测试速度:
library("dplyr")
d2 <- dat %>% group_by(Subject) %>%
summarise(Nationality=head(Nationality,1))
table(d2$Nationality)
我的机器上需要大约1.9秒......
另一方面
n <- 351078 ## divisible by 3, for convenience
set.seed(101)
nat <- sample(c("G","D","S"),size=n/3,replace=TRUE)
dat <- data.frame(Subject = rep(1:(n/3),each=3),
Nationality = rep(nat,each=3))
system.time(tab <- with(dat,table(tapply(as.character(Nationality),
list(Subject),head,n=1))))
大约需要0.02(!)秒......