1
votes

Grouper par, agréger pour créer une nouvelle colonne en fonction des conditions

Voici les données

DPS Comodity            Std Issue
111 Hard drive,MBD,LCD  Hard drive-No Post,MBD-NoBoot,LCD-Flicker
222 MBD,LCD                 No Post
333 MBD                 No Power

Je dois obtenir dans le format ci-dessous

aggregate(Std Issue~DPS,df,function(x)toString(uniqe(x)))

J'ai essayé aggregate (Std Problème ~ DPS, df, function (x) toString (uniqe (x))) , mais il en résulte un problème Std comme

No Post,No Boot, Flicker
No Post
No Power

Ce qui n'est pas conforme à mon exigence, toute suggestion à ce sujet pour résoudre ce type de problème sera très utile et appréciée.

DPS Comodity            Std Issue
111 Hard drive,MBD,LCD  Hard drive-No Post,MBD-NoBoot,LCD-Flicker
222 MBD,LCD                 No Post
333 MBD                 No Power

ou

Voici le résultat attendu p >

DPS Comodity    Std Issue
111 Hard drive  No Post
111 MBD         NoBoot
111 LCD         Flicker
222 MBD         No Post
222 LCD         No Post
333 MBD         No power

r

4 commentaires

D'où vient unique ? Pourriez-vous partager vos données avec dput ?


Merci NelsonGon, pour chaque DPS unique, le numéro std Issue-row1 devrait être: Hard drive-No Post; MBD-Pas de démarrage, LCD-Flicker. La deuxième ligne de la colonne Std Issue ne doit avoir que «No Post», car les deux Comodity (MBD, LCD) de la 2e ligne sont No Post et la 3e ligne de Std Issue, la colonne No Power


Mais, il peut y avoir un certain modèle pour reconnaître la sortie de 2e et 3e rangée. Veuillez expliquer pourquoi votre sortie doit ressembler à ceci sur votre deuxième ou troisième ligne pour bien comprendre.


@Rushabh: Je dois créer une nouvelle colonne qui devrait avoir des valeurs sous la forme de comodity-std Issue pour tous les cas où différents problèmes std sont rencontrés pour chaque DPS. Si les problèmes std sont les mêmes pour un DPS particulier, la nouvelle colonne pour cette ligne ne doit avoir que la valeur Std Issue. J'espère que cette fois, je suis en mesure de clarifier, de bien vouloir suggérer une solution pour cela. Merci beaucoup pour votre temps.


3 Réponses :


1
votes

Vous pouvez le faire en utilisant data.table package-

> setDT(dt)[,Std_Issue:=paste0(Comodity,"-",Std.Issue)]
> setDT(dt)[, list(Std_issue = ifelse(length(unlist(unique(lapply(str_split(Std_Issue,"-"),function(x)x[2]))))<3,paste(unique(`Std.Issue`), collapse=","),paste(Std_Issue, collapse=",")),Commodity=paste(Comodity, collapse=",")), by=DPS]

   DPS                            Std_issue                  Commodity
1: 111       Hard drive-No Post,MBD-NoBoot,LCD-Flicker   Hard drive,MBD,LCD
2: 222                              No Post                   MBD,LCD
3: 333                              No power                    MBD

Sortie -

dt <- read.table(text="DPS  Comodity    Std Issue
111 Hard drive  No Post
                 111    MBD NoBoot
                 111    LCD Flicker
                 222    MBD No Post
                 222    LCD No Post
                 333    MBD No power",header=T,sep="\t")


5 commentaires

Merci Rushabh, mais j'ai besoin de la sortie comme ceci: la colonne Std Issue_new doit avoir la valeur: Disque dur-No Post, MBD-NoBoot, LCD-Flicker; Pas d'article; Aucune puissance. La logique est que pour chaque ligne de produit, la nouvelle colonne doit avoir un problème comodity-std lorsqu'un problème std différent est trouvé dans la même ligne. Si le même problème Std est détecté, la nouvelle colonne ne doit avoir qu'un seul problème Std dans la nouvelle colonne. J'espère que cela sera plus clair maintenant, veuillez partager vos commentaires pour obtenir une solution comme celle-ci.


@Ankit J'ai mis à jour la réponse avec la sortie souhaitée.


: @Rushabh: la sortie devrait être pour la nouvelle colonne devrait avoir: Disque dur-No Post, MBD-NoBoot, LCD-Flicker pour DPS 111; pour DPS 222, il ne doit contenir que No Post; pour DPS 333 ne doit contenir aucune alimentation. La logique derrière cela est si pour chaque DPS unique, la nouvelle colonne aura des problèmes comodity-std uniquement lorsqu'il y a un problème std différent, sinon collez uniquement le problème std.


Merci, j'ai écrit le code mais je ne savais pas comment publier dans le bon format, merci d'avoir rendu le message plus clair. Pouvez-vous également me faire savoir si je dois montrer le résultat de mon code au public, comment puis-je faire ici, puis-je partager une capture d'écran ou un fichier image du résultat?


@Vous pouvez simplement copier-coller votre sortie et la formater sous forme d'extrait de code.



0
votes

Nous pouvons utiliser dplyr pour appliquer aux deux colonnes, c'est à dire

# A tibble: 3 x 3
    DPS Comodity             Std_Issue               
  <int> <chr>                <chr>                   
1   111 Hard_drive, MBD, LCD No_Post, NoBoot, Flicker
2   222 MBD, LCD             No_Post                 
3   333 MBD                  No_power

ce qui donne,

library(dplyr)
df %>% 
 group_by(DPS) %>% 
 summarise_all(funs(toString(unique(.))))


1 commentaires

Merci Sotos, mais ce n'est pas ce que je veux en sortie. La colonne Std_Issue doit avoir les valeurs Hard_drive-No_Post, MBD-NoBoot, LCD-Flicker dans la 1ère ligne. Pour la 2ème ligne de Std_Issue ne doit avoir que No_Post, et la 3ème ligne doit avoir No_power



0
votes

Enfin, j'ai trouvé la solution qui a fonctionné:

test_df <- data.frame(DPS=c(111,111,111,222,222,333),comodity =c("HDD","MBD","LCD","MBD","LCD","MBD"),stdIss=c("No Post","No Boot","Flicker","No Post","No Post","No Power"))
A <- data.frame(tapply(test_df$comodity,test_df$DPS,FUN = function(x){toString(x)}))
B <- data.frame(tapply(test_df$stdIss,test_df$DPS,FUN=function(x{toString(unique(x))}))
C <- data.frame(A,B)
colnames(C)[1] <- "comodity"
colnames(C)[2] <- "Std Issue"
C$comodity <- strsplit(C$comodity, split = ",")

C$`Std Issue` <- strsplit(C$`Std Issue`,split = ",")
C$new <- NA

D <- list()

for(i in 1:nrow(C)){

   if(length(C$`Std Issue`[[i]])>1){for(j in 1:length(C$`Std Issue`[[i]]))
     {
       D[j]<- paste(C$comodity[[i]][j],C$`Std Issue`[[i]][j],sep = "-")
     }
       C$new[i]<-paste(D,collapse = ",")

     }
    else 
     { 
       C$new[i] <-paste(C$`Std Issue`[i])
     }
}


1 commentaires

Comment puis-je publier un extrait ici, j'ai le résultat que je ne peux pas copier et coller ici, veuillez suggérer