2017-10-18 21 views
1

Je donne les résultats suivants data.frameComment appliquer des conditions sur un élément de groupe particulier et trouver des permutations d'un autre groupe dans la même table?

Category Product Status 
1  A  qwe  In 
2  A  rty  In 
3  A  ewq Out 
4  B  dfs  In 
5  B  sgf  In 
6  C  mnb Out 
7  C  ves Out 
8  C  klm Out 
9  C  nbc Out 

Mon but est de créer une colonne Drapeau par groupe de la catégorie où les niveaux sont OnlyIn, OnlyOut et BothInOut , correspondant aux valeurs du Statut Colonne.

En tant que partie I calculé compte sur In et Out par groupe en utilisant le code ci-dessous:

Data <- Data %>% 
    group_by(Category,Status) %>% 
    dplyr::mutate(InCounts = length(Status[Status == "in"]), 
       OutCounts = length(Status[Status == "out"])) 

Et je suis le résultat ci-dessous:

Category Product Status CountIn CountOut 
1  A  qwe  In  2  0 
2  A  rty  In  2  0 
3  A  ewq Out  0  1 
4  B  dfs  In  2  0 
5  B  sgf  In  2  0 
6  C  mnb Out  0  4 
7  C  ves Out  0  4 
8  C  klm Out  0  4 
9  C  nbc Out  0  4 

Maintenant, je ne suis pas Assurez-vous de tirer parti de ces informations pour créer le nouveau drapeau de colonne en comptant le total des entrées et des sorties par catégorie et ajoutez une valeur appropriée.

Par exemple, s'il y a deux et comme état d'une catégorie, le drapeau devrait lire « BothInOut »

Exemple de sortie:

Category Product Status CountIn CountOut  Flag 
1  A  qwe  In  2  0 BothInOut 
2  A  rty  In  2  0 BothInOut 
3  A  ewq Out  0  1 BothInOut 
4  B  dfs  In  2  0 OnlyIn 
5  B  sgf  In  2  0 OnlyIn 
6  C  mnb Out  0  4 OnlyOut 
7  C  ves Out  0  4 OnlyOut 
8  C  klm Out  0  4 OnlyOut 
9  C  nbc Out  0  4 OnlyOut 

Entrée Reproductibles pour les données

structure(list(Category = c("A", "A", "A", "B", "B", "C", "C", 
"C", "C"), Product = c("qwe", "rty", "ewq", "dfs", "sgf", "mnb", 
"ves", "klm", "nbc"), Status = c("In", "In", "Out", "In", "In", 
"Out", "Out", "Out", "Out"), CountIn = c(2, 2, 0, 2, 2, 0, 0, 
0, 0), CountOut = c(0, 0, 1, 0, 0, 4, 4, 4, 4), Flag = c("BothInOut", 
"BothInOut", "BothInOut", "OnlyIn", "OnlyIn", "OnlyOut", "OnlyOut", 
"OnlyOut", "OnlyOut")), .Names = c("Category", "Product", "Status", 
"CountIn", "CountOut", "Flag"), row.names = c(NA, 9L), class = "data.frame") 
+2

'df%>% group_by (Catégorie)%>% mute (Flag1 = toString (unique (Status)))' – Sotos

+0

C'est fait, alors. – sunitprasad1

Répondre

0

Ref à @Sotos commentaire:

Data <- Data %>% group_by(Category) %>% mutate(Flag1 = toString(unique(Status))) 

Data$Flag <- ifelse(Data$Flag1 == "In","OnlyIn", 
        ifelse(Data$Flag1 == "Out","OnlyOut","BothInOut")) 

gets le travail accompli.

Category Product Status Flag1  Flag2 
1  A  qwe  In In, Out BothInOut 
2  A  rty  In In, Out BothInOut 
3  A  ewq Out In, Out BothInOut 
4  B  dfs  In  In OnlyIn 
5  B  sgf  In  In OnlyIn 
6  C  mnb Out  Out OnlyOut 
7  C  ves Out  Out OnlyOut 
8  C  klm Out  Out OnlyOut 
9  C  nbc Out  Out OnlyOut 
1

Je dirais que le commentaire de @Sotos le fait bien, une autre approche pour obtenir les étiquettes exactes serait

df <- df %>% 
    group_by(Category) %>% 
    mutate(Flag2 = ifelse("In" %in% unique(Status) & "Out" %in% unique(Status), "BothInOut", ifelse("In" %in% unique(Status), "OnlyIn", "OnlyOut"))) 

> df 
Source: local data frame [9 x 7] 
Groups: Category [3] 

# A tibble: 9 x 7 
    Category Product Status CountIn CountOut  Flag  Flag2 
    <chr> <chr> <chr> <dbl> <dbl>  <chr>  <chr> 
1  A  qwe  In  2  0 BothInOut BothInOut 
2  A  rty  In  2  0 BothInOut BothInOut 
3  A  ewq Out  0  1 BothInOut BothInOut 
4  B  dfs  In  2  0 OnlyIn OnlyIn 
5  B  sgf  In  2  0 OnlyIn OnlyIn 
6  C  mnb Out  0  4 OnlyOut OnlyOut 
7  C  ves Out  0  4 OnlyOut OnlyOut 
8  C  klm Out  0  4 OnlyOut OnlyOut 
9  C  nbc Out  0  4 OnlyOut OnlyOut 
1

Je recommande de faire un commentaire @Sotos plus robuste, à savoir l'ordre de l'étiquette ne doit pas dépendre de l'ordre dans les données en ajoutant sort:

df %>% group_by(Category) %>% 
    mutate(Flag1 = toString(sort(unique(Status))) 

Si vous voulez avoir la données étiquetées comme vous le suggérez, vous pouvez l'étendre à:

df %>% group_by(Category) %>% 
    mutate(Flag1 = paste0(sort(unique(Status)), collapse = "") %>% 
       paste0(ifelse(. == "InOut", "Both", "Only"), .)) 

ce qui donne:

Category Product Status CountIn CountOut  Flag  Flag1 
    <chr> <chr> <chr> <dbl> <dbl>  <chr>  <chr> 
1  A  qwe  In  2  0 BothInOut BothInOut 
2  A  rty  In  2  0 BothInOut BothInOut 
3  A  ewq Out  0  1 BothInOut BothInOut 
4  B  dfs  In  2  0 OnlyIn OnlyIn 
5  B  sgf  In  2  0 OnlyIn OnlyIn 
6  C  mnb Out  0  4 OnlyOut OnlyOut 
7  C  ves Out  0  4 OnlyOut OnlyOut 
8  C  klm Out  0  4 OnlyOut OnlyOut 
9  C  nbc Out  0  4 OnlyOut OnlyOut