¿Cómo crear una variable basada en la cantidad de valores únicos en otro marco de datos?

Aug 16 2020

Este es un ejemplo simplificado de lo que quiero hacer.

El conjunto de datos 1 (DF1) tiene datos de manzanas (como el tamaño o la cantidad de agujeros), y un segundo conjunto de datos (DF2) tiene información de los gusanos que se encuentran en su interior, incluido el color y en qué manzana se encontraron. Lo que quiero hacer es agregar una variable en DF1 con la cantidad de colores únicos (de los gusanos) que existen en cada manzana.

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

Soy nuevo en R, y al tratar de resolverlo pensé en:

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

Pero me devuelve una nueva variable llena de ceros, en lugar del vector deseado:

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

te agradeceria mucho tu ayuda

Respuestas

3 akrun Aug 16 2020 at 02:11

Esto podría hacerse haciendo uso de la unión con las columnas 'Q', 'x' de ambos conjuntos de datos, contar los valores únicos de 'R' y asignarlos a una nueva columna en 'DF1'

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

o usandotidyverse

library(dplyr)
DF2 %>%
   group_by(x = Q) %>%
   summarise(N.Colors = n_distinct(R)) %>%
   right_join(DF1)
3 DarrenTsai Aug 16 2020 at 02:19

Una basesolución con aggregate()y 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