Select 列中的第一个新值
Select the first new value in a column
我有一个包含 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 只是 returns 观察的总数。我怎样才能告诉 R 只 select 每个受试者的国籍一次?
构造数据:
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()
在向量 (Nationality
) 的每个元素上运行指定的函数 (head
),由组 (list(Subject)
) 分隔,带有可选参数 (n=1
只取第一个元素)。
as.character()
很难看,但会阻止 R 将因子转换为数字代码。
table
计算 table.
你也可以试试这个:
library("dplyr")
d2 <- dat %>% group_by(Subject) %>%
summarise(Nationality=head(Nationality,1))
table(d2$Nationality)
测试速度:
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))))
这在我的机器上大约需要 1.9 秒...
另一方面
system.time(tab2 <- with(dat,table(Nationality[!duplicated(Subject)])))
大约需要 0.02 (!) 秒...
我有一个包含 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 只是 returns 观察的总数。我怎样才能告诉 R 只 select 每个受试者的国籍一次?
构造数据:
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()
在向量 (Nationality
) 的每个元素上运行指定的函数 (head
),由组 (list(Subject)
) 分隔,带有可选参数 (n=1
只取第一个元素)。as.character()
很难看,但会阻止 R 将因子转换为数字代码。table
计算 table.
你也可以试试这个:
library("dplyr")
d2 <- dat %>% group_by(Subject) %>%
summarise(Nationality=head(Nationality,1))
table(d2$Nationality)
测试速度:
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))))
这在我的机器上大约需要 1.9 秒...
另一方面
system.time(tab2 <- with(dat,table(Nationality[!duplicated(Subject)])))
大约需要 0.02 (!) 秒...