Векторизованный подход для объединения нескольких наблюдений - PullRequest
0 голосов
/ 21 февраля 2019

Я не нашел ничего похожего на 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")

Теперь я хотел бы упростить свои наблюдения, показывая 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 голосов
/ 21 февраля 2019

Если вам нужна скорость и краткость, вам может понравиться 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
0 голосов
/ 21 февраля 2019

A 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...