किसी अन्य डेटा फ़्रेम में अद्वितीय मानों की संख्या के आधार पर एक चर कैसे बनाएं?

Aug 16 2020

यह एक सरल उदाहरण है कि मैं क्या करना चाहता हूं।

डेटासेट 1 (DF1) में सेब का डेटा (आकार या छिद्रों की संख्या), और एक दूसरे डेटासेट (DF2) में उनके अंदर पाए जाने वाले कीड़े की जानकारी है, जिसमें रंग भी शामिल है, और जिस सेब में वे पाए गए थे। मैं जो करना चाहता हूं वह डीएफ 1 में एक चर जोड़ने के लिए है जिसमें प्रत्येक सेब में मौजूद अनूठे रंग (कीड़े) हैं।

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

मैं आर में नया हूं, और जब इसे हल करने की कोशिश कर रहा हूं तो मैंने सोचा:

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

लेकिन यह मुझे वांछित वेक्टर के बजाय 0s से भरा एक नया चर वापस देता है:

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

मैं इसके साथ आपकी मदद की बहुत सराहना करता हूं

जवाब

3 akrun Aug 16 2020 at 02:11

यह दोनों डेटासेट के 'Q', 'x' कॉलम के साथ जुड़ने का उपयोग करके किया जा सकता है, 'R' के अद्वितीय मानों को गिनें और इसे 'DF1' में एक नए कॉलम में असाइन करें

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

या उपयोग कर रहे हैं tidyverse

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

के baseसाथ एक समाधान aggregate()और 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