结合多个观测值的矢量​​化方法

时间:2019-02-21 09:20:28

标签: r loops dataframe vectorization

我在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时,即显示最终表,例如

,才显示TRUE
ID    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), ]

由于我的最终数据集非常大,我希望能提供一些建议或函数以实现这种方法的矢量化,并且我希望使用更简洁的代码。

提前谢谢!

2 个答案:

答案 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