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?
Đâ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
Đ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)
Một base
giải pháp với aggregate()
và 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