Làm thế nào để tạo một biến dựa trên số lượng giá trị duy nhất trong một khung dữ liệu khác?

Aug 16 2020

Đây là một ví dụ đơn giản về những gì tôi muốn làm.

Tập dữ liệu 1 (DF1) có dữ liệu về những quả táo (như kích thước hoặc số lỗ) và tập dữ liệu thứ hai (DF2) có thông tin về những con sâu được tìm thấy bên trong chúng, bao gồm cả màu sắc và quả táo được tìm thấy. Những gì tôi muốn làm là thêm một biến trong DF1 với số màu duy nhất (của những con sâu) tồn tại trong mỗi quả táo.

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

Tôi là người mới trong R, và khi cố gắng giải quyết nó, tôi đã nghĩ đến:

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

Nhưng nó trả lại cho tôi một biến mới chứa các số 0, thay vì vectơ mong muốn:

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

Tôi đánh giá rất cao sự giúp đỡ của bạn về nó

Trả lời

3 akrun Aug 16 2020 at 02:11

Điều này có thể được thực hiện bằng cách sử dụng phép nối với các cột 'Q', 'x' của cả hai tập dữ liệu, đếm các giá trị duy nhất của 'R' và gán nó vào một cột mới trong 'DF1'

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

Hoặc sử dụng 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

Một basegiải pháp với 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