Подмножество данных в R, где столбец должен иметь 3 возможности - PullRequest
0 голосов
/ 13 марта 2020

У меня есть data.frame, который имеет 3 столбца: имя агента, классификация (A, B, C или D) и номера недели, т. Е. Week1, Week2 et c.

Агенты могут быть в течение нескольких недель, имея одну из 4 категорий. В настоящее время у меня есть данные до 10 недель.

Я хочу создать подмножество, которое имеет «A» в качестве категории и доступно во всех: Week8, Week9 и Week10 (последние 3 недели).

В настоящее время я построил эту функцию для достижения желаемых результатов: -

cautionAgentsLocator = function(classification){

cautionAgents = NA

if(classification == "Bad"){

 cautionAgents = combData[combData$ABCD.Categorization == "D", ]

 cautionAgents = cautionAgents[cautionAgents$Weeks == "Week8" | cautionAgents$Weeks == "Week9" | cautionAgents$Weeks == "Week10", ]

cautionAgents = cautionAgents[, c("Agent.Name", "SPD", "Normalized.Distribution", "ABCD.Categorization", "Weeks")]

}

if(classification == "Good"){

cautionAgents = combData[combData$ABCD.Categorization == "A", ]

cautionAgents = cautionAgents[cautionAgents$Weeks == "Week8" | cautionAgents$Weeks == "Week9" | cautionAgents$Weeks == "Week10", ]

cautionAgents = cautionAgents[, c("Agent.Name", "SPD", "Normalized.Distribution", "ABCD.Categorization", "Weeks")]

}


uniqueName = unique(cautionAgents$Agent.Name)

for(i in uniqueName){
count = nrow(cautionAgents[cautionAgents$Agent.Name == i, ])
missingWeeks = setdiff(c("Week8", "Week9", "Week10"), cautionAgents$Weeks[cautionAgents$Agent.Name == i])
if(count < 3){
  cautionAgents = cautionAgents[-which(cautionAgents$Agent.Name == i), ]
 }
}

Может ли это быть достигнуто с помощью одной строки кода, т. Е. Одного оператора поднабора, с использованием dplyr или каким-то лучшим способом?

Чтобы создать только часть данных, вот код: -

structure(list(Agent.Name = c("Christy Deruise", "Allen Voorhees", 
"Daniel Gonzalez Gaviria", "Denise Bradley", "Shimron Larose", 
"Tiana Morman", "James Cagle Jr", "Vicki Smith", "Donna Paskett", 
"Joan Balde"), ABCD.Categorization = c("D", "D", "D", "D", "D", 
"D", "D", "D", "D", "D"), Weeks = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Week1", "Week2", "Week3", 
"Week4", "Week5", "Week6", "Week7", "Week8", "Week9", "Week10"
), class = "factor")), row.names = c(NA, 10L), class = "data.frame")

Но, конечно, фактические данные имеют около 4000 строк, где каждый агент присутствует в течение нескольких недель, имея разные категоризации для каждой недели.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

"Как это?

library(dplyr)
combData %>%
    filter(ABCD.Categorization == "A", Weeks %in% c("Week8", "Week9", "Week10")) %%>
    select(Agent.Name, ABCD.Categorization, Weeks)
0 голосов
/ 14 марта 2020

Попробуйте использовать:

library(dplyr)

df %>%
  filter(ABCD.Categorization == "A") %>%
  group_by(Agent.Name) %>%
  filter(all(c("Week8", "Week9", "Week10") %in%  Weeks) & 
         Weeks %in% c(c("Week8", "Week9", "Week10")))
...