Опция с использованием data.table
library(data.table)
setDT(df)[, .(AnimalComb = toString(unique(Animal)),
CountbyID = .N/uniqueN(Animal)), by = PersonID]
data
df <- structure(list(Animal = c("Dog", "Cat", "Bird", "Snake", "Spider",
"Cat", "Dog"), PersonID = c(1L, 4L, 1L, 2L, 2L, 3L, 4L)),
class = "data.frame", row.names = c(NA, -7L))