Bagaimana cara membuat variabel berdasarkan jumlah nilai unik dalam bingkai data lain?

Aug 16 2020

Ini adalah contoh sederhana dari apa yang ingin saya lakukan.

Set data 1 (DF1) berisi data apel (seperti ukuran atau jumlah lubang), dan set data kedua (DF2) berisi informasi cacing yang ditemukan di dalamnya, termasuk warna, dan di mana apel ditemukan. Yang ingin saya lakukan adalah menambahkan variabel di DF1 dengan jumlah warna unik (dari cacing) yang ada di setiap apel.

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

Saya baru di R, dan ketika mencoba menyelesaikannya, saya memikirkan:

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

Tapi itu memberi saya kembali variabel baru yang diisi dengan 0s, bukan vektor yang diinginkan:

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

Saya sangat menghargai bantuan Anda

Jawaban

3 akrun Aug 16 2020 at 02:11

Ini dapat dilakukan dengan memanfaatkan gabungan dengan kolom 'Q', 'x' dari kedua dataset, menghitung nilai unik 'R' dan menetapkannya ke kolom baru di 'DF1'

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

Atau menggunakan 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

Sebuah basesolusi dengan aggregate()dan 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