2017-06-06 2 views
2

j'ai un ensemble de données de test que j'ai divisé par trimestre:Utilisation des opérateurs logiques avec% en% et sous

> test 
    id quarter 
1 7  Q1 
2 7  Q1 
3 5  Q1 
4 8  Q1 
5 3  Q1 
6 6  Q1 
7 10  Q1 
8 3  Q2 
9 10  Q2 
10 8  Q2 
11 2  Q2 
12 7  Q2 
13 6  Q2 
14 6  Q3 
15 9  Q3 
16 6  Q3 
17 4  Q3 
18 9  Q3 
19 2  Q3 
20 5  Q4 
21 8  Q4 
22 10  Q4 
23 7  Q4 
24 1  Q4 
25 8  Q4 

subsets <-split(test, test$quarter, drop=TRUE) 

for (i in 1:length(subsets)) { 
    assign(paste0("Q", i), as.data.frame(subsets[[i]])) 
} 

Maintenant, mon objectif est de découvrir toutes les Identifiants uniques dans Q3 qui ne sont pas Q1 ou au Q2. Utilisation de l'opérateur %in% je tente:

Q1_ids <- unique(Q1$id) 
Q2_ids <- unique(Q2$id) 

Q3_ids <- subset(unique(Q3$id), !(unique(Q3$id) %in% Q1_ids | Q2_ids)) 

mais je reçois une erreur qui operations are possible only for numeric, logical or complex types. Je peux sous-estimer un vecteur, par exemple si je n'utilise que Q1_ids, mais je ne peux pas utiliser un opérateur logique. Quelle est la solution à cela en utilisant la fonction subset() ou une autre façon d'aborder le problème?

> dput(test) 
structure(list(id = c(7, 7, 5, 8, 3, 6, 10, 3, 10, 8, 2, 7, 6, 
6, 9, 6, 4, 9, 2, 5, 8, 10, 7, 1, 8), quarter = c("Q1", "Q1", 
"Q1", "Q1", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", 
"Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q4", "Q4", "Q4", "Q4", "Q4", 
"Q4")), .Names = c("id", "quarter"), row.names = c(NA, -25L), class = "data.frame", index = structure(integer(0), "`__quarter`" = integer(0))) 

Répondre

2
Q3_ids <- unique(setdiff(Q3$id , union(Q2$id, Q1$id))) 
+0

Et s'il y a plus de vecteurs à inclure dans 'union()'? par exemple, si je voulais union '(Q3 $ id, Q2 $ id, Q1 $ id) '? –

+0

vous les imbriquez: union (x, union (y, z)) –

0

Vous pouvez toujours écrire une fonction qui extrait les éléments que vous recherchez, puis appeler la carte (ou une fonction appliquer) pour appliquer la fonction à chacun des trimestres. Cette solution particulière tidyverse produirait une liste nommée, contenant votre sortie désirée pour chaque trimestre:

library(tidyverse) 

get_distinct <- function(x, data) { 
    distinct_id <- data[data$quarter == x, 1] %>% 
     unique() 
    setdiff(distinct_id, data[!data$quarter == x, 1] %>% 
     unique()) 
} 

quarters <- unique(test$quarter) 

dat <- map(.x = quarters, .f = get_distinct, data = test) %>% 
    set_names(quarters)