Comment créer une variable basée sur le nombre de valeurs uniques dans un autre bloc de données ?
Ceci est un exemple simplifié de ce que je veux faire.
L'ensemble de données 1 (DF1) contient des données sur les pommes (comme la taille ou le nombre de trous), et un deuxième ensemble de données (DF2) contient des informations sur les vers trouvés à l'intérieur, y compris la couleur et dans quelle pomme ils ont été trouvés. Ce que je veux faire, c'est ajouter une variable dans DF1 avec le nombre de couleurs uniques (des vers) qui existent dans chaque pomme.
DF1<-data.frame(x=c("A1","A2","A3","A4","A5"),y=c(3,26,5,27,5))
DF2<-data.frame(Q=c("A1","A1","A1","A1","A1","A1","A2","A2","A3","A3","A3","A4","A5","A5","A5","A5"),R=c("red","red","blue","yellow","yellow","blue","orange","orange","green","red","red","blue","blue", "purple","black","red"),S=c(4,5,3,5,4,3,5,4,3,5,4,3,5,4,3,5))
Je suis nouveau dans R, et en essayant de le résoudre, j'ai pensé à :
DF1$N.Colors<-length(unique(DF2$R[match(DF1$X,DF2$Q)]))
Mais cela me renvoie une nouvelle variable remplie de 0, au lieu du vecteur recherché :
DF1$N.Colors<-c(3,1,2,1,4)
J'apprécierais beaucoup votre aide
Réponses
Cela pourrait être fait en utilisant la jointure avec les colonnes 'Q', 'x' des deux ensembles de données, compter les valeurs uniques de 'R' et l'affecter à une nouvelle colonne dans 'DF1'
library(data.table)
DF1$N.Colors <- setDT(DF2)[DF1, uniqueN(R), on = .(Q = x), by = .EACHI]$V1
Ou en utilisanttidyverse
library(dplyr)
DF2 %>%
group_by(x = Q) %>%
summarise(N.Colors = n_distinct(R)) %>%
right_join(DF1)
Une base
solution avec aggregate()
et merge()
:
merge(DF1, aggregate(N.Colors ~ Q, list(N.Colors = DF2$R, Q = DF2$Q), function(x) length(unique(x))), all.x = T, by.x = "x", by.y = "Q")
# x y N.Colors
# 1 A1 3 3
# 2 A2 26 1
# 3 A3 5 2
# 4 A4 27 1
# 5 A5 5 4