Wie erstelle ich eine Variable basierend auf der Anzahl eindeutiger Werte in einem anderen Datenrahmen?

Aug 16 2020

Dies ist ein vereinfachtes Beispiel dafür, was ich tun möchte.

Datensatz 1 (DF1) enthält Daten von Äpfeln (wie die Größe oder Anzahl der Löcher), und ein zweiter Datensatz (DF2) enthält Informationen über darin gefundene Würmer, einschließlich Farbe und in welchem ​​Apfel sie gefunden wurden. Was ich tun möchte, ist, eine Variable in DF1 mit der Anzahl der eindeutigen Farben (der Würmer) hinzuzufügen, die in jedem Apfel vorhanden sind.

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))

Ich bin neu in R, und als ich versuchte, es zu lösen, dachte ich an:

DF1$N.Colors<-length(unique(DF2$R[match(DF1$X,DF2$Q)]))

Aber es gibt mir eine neue Variable zurück, die mit Nullen gefüllt ist, anstelle des gewünschten Vektors:

 DF1$N.Colors<-c(3,1,2,1,4)

Ich würde Ihre Hilfe dabei sehr schätzen

Antworten

3 akrun Aug 16 2020 at 02:11

Dies könnte erfolgen, indem Sie die Verknüpfung mit den Spalten „Q“, „x“ beider Datensätze verwenden, die eindeutigen Werte von „R“ zählen und sie einer neuen Spalte in „DF1“ zuweisen.

library(data.table)
DF1$N.Colors <- setDT(DF2)[DF1, uniqueN(R), on = .(Q = x), by = .EACHI]$V1

Oder verwendentidyverse

library(dplyr)
DF2 %>%
   group_by(x = Q) %>%
   summarise(N.Colors = n_distinct(R)) %>%
   right_join(DF1)
3 DarrenTsai Aug 16 2020 at 02:19

Eine baseLösung mit aggregate()und 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