2017-07-14 1 views
0

Comment puis-je réduire les données dans un format large (voir l'exemple ci-dessous) dans une colonne concaténée affichant uniquement les valeurs TRUE? Je veux finir avec un tableau de données au format Nom de l'employé | "chaîne d'en-têtes de colonnes applicables" comme illustré dans demoOUT.R: Réduire les données "larges" en une seule colonne concaténée basée sur le binaire "Oui/Non"

library(data.table) 
demoIN <- data.table(
    Name=c("Mike Jones","Bobby Fisher"), 
    A=c(1,0), 
    B=c(1,1), 
    C=c(0,0), 
    D=c(1,1)) 

      Name A B C D 
1: Mike Jones 1 1 0 1 
2: Bobby Fisher 0 1 0 1 

demoOUT <- data.table(
    Name=c("Mike Jones","Bobby Fisher"), 
    Cases =c("A,B,D","B,D")) 

      Name Cases 
1: Mike Jones A,B,D 
2: Bobby Fisher B,D 

Répondre

2

Une solution utilise des fonctions de dplyr et tidyr. demoIN2 est la sortie finale.

library(dplyr) 
library(tidyr) 

demoIN2 <- demoIN %>% 
    gather(Cases, Value, -Name) %>% 
    filter(Value == 1) %>% 
    group_by(Name) %>% 
    summarise(Cases = paste(Cases, collapse = ",")) 
+0

Impressionnant, merci, je suis curieux de savoir, comment interpréter le fait tidyr! "-" signe dans 'recueillir() ' – Mako212

+1

Cela signifie que la colonne' Name' ne va pas être rassemblée – www

2

Voici une solution de base de R si vous étiez intéressé.

demoIN$Cases <- apply(demoIN[, -c("Name")], 1, function(x) paste(na.omit(ifelse(x == 1, names(x), NA)), collapse = ",")) 

demoIN <- demoIN[,c("Name","Cases")] 
+0

Nice.Intéressant beaucoup plus lent que 'dplyr/tidyr', juste essayé avec 1,2M lignes et a pris 43,68 secondes, contre 2,61 secondes avec' dplyr/tidyr ' – Mako212

1

Voici une option à l'aide data.table (comme l'objet initial est data.table

library(data.table) 
melt(demoIN, id.var = 'Name')[value==1, .(Cases = paste(variable, collapse=',')), Name] 
#   Name Cases 
#1: Mike Jones A,B,D 
#2: Bobby Fisher B,D