จะสร้างตัวแปรตามจำนวนค่าที่ไม่ซ้ำกันใน data frame อื่นได้อย่างไร?
Aug 16 2020
นี่คือตัวอย่างง่ายๆของสิ่งที่ฉันต้องการทำ
ชุดข้อมูล 1 (DF1) มีข้อมูลของแอปเปิ้ล (เช่นขนาดหรือจำนวนหลุม) และชุดข้อมูลที่สอง (DF2) มีข้อมูลของเวิร์มที่พบภายในพวกมันรวมถึงสีและแอปเปิลที่พบ สิ่งที่ฉันต้องการทำคือเพิ่มตัวแปรใน DF1 ด้วยจำนวนสีที่ไม่ซ้ำกัน (ของเวิร์ม) ที่มีอยู่ในแอปเปิ้ลแต่ละลูก
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))
ฉันใหม่ใน R และเมื่อพยายามแก้ปัญหาฉันนึกถึง:
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