Comment créer une variable basée sur le nombre de valeurs uniques dans un autre bloc de données ?

Aug 16 2020

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

3 akrun Aug 16 2020 at 02:11

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)
3 DarrenTsai Aug 16 2020 at 02:19

Une basesolution 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