다른 데이터 프레임의 고유 값 수를 기반으로 변수를 만드는 방법은 무엇입니까?

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

하지만 원하는 벡터 대신 0으로 채워진 새 변수를 반환합니다.

 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