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
3 Réponses :
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")
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.
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(.))))
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
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])
}
}
Comment puis-je publier un extrait ici, j'ai le résultat que je ne peux pas copier et coller ici, veuillez suggérer
D'où vient
unique? Pourriez-vous partager vos données avecdput?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.