我在SO(或其他地方)上没有发现任何类似的东西,因此希望您的帮助。我对找到矢量化方法还不是很熟悉,我的最初尝试感觉很笨拙。
我目前有一个与此相似的数据框:
df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(TRUE,FALSE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE))
colnames(df) <- c("ID", "Status")
我现在想简化我的观察,仅当将特定ID的每个状态都指定为TRUE时,即显示最终表,例如
,才显示TRUEID Status
1 FALSE
2 FALSE
3 TRUE
我设法做到了循环(再次,即使对于一个循环,它可能也很笨拙):
NrID <- df$ID[!duplicated(df$ID)]
for (i in NrID) {
x <- sum(df$Status[df$ID == i])
ifelse (x < max(NrID), df$Status[df$ID == i] <- FALSE, df$Status[df$ID == i] <- TRUE)
}
finaldf <- df[!duplicated(df$ID), ]
由于我的最终数据集非常大,我希望能提供一些建议或函数以实现这种方法的矢量化,并且我希望使用更简洁的代码。
提前谢谢!
答案 0 :(得分:2)
dplyr
解决方案可以是:
df %>%
group_by(ID) %>%
summarise(Status = all(Status))
ID Status
<dbl> <lgl>
1 1. FALSE
2 2. FALSE
3 3. TRUE
或使用基数R:
aggregate(df$Status, list(df$ID), function(x) all(x))
Group.1 x
1 1 FALSE
2 2 FALSE
3 3 TRUE
答案 1 :(得分:1)
如果追求速度和简洁性,您可能会喜欢data.table
:
设置:
library(data.table)
setDT(df) # Convert to data.table
计算:
df[, .(Status = all(Status)), by = ID]
# ID Status
# 1: 1 FALSE
# 2: 2 FALSE
# 3: 3 TRUE