Мы можем просто использовать table
из base R
table(df)
# cat1
#userID f m u
# a 2 1 1
# b 0 2 1
Или с dcast
из data.table
library(data.table)
dcast(setDT(df), userID ~ paste0('cat1_', cat1))
данные
df <- structure(list(userID = c("a", "a", "a", "a", "b", "b", "b"),
cat1 = c("f", "f", "u", "m", "u", "m", "m")), class = "data.frame",
row.names = c(NA, -7L))