Вы можете использовать tidyverse
:
df <- tribble(~Participant, ~Time, ~Race, ~Sex,
1, 1, "White", "Male",
1, 2, NA, NA,
1, 3, "White", "Male",
2, 2, "Black", "Male",
2, 3, "Black", "Male",
2, NA, NA, NA,
3, 1, "Black", "Female",
3, NA, NA, NA,
3, NA, NA, NA)
df %>%
group_by(Time, Race, Sex) %>%
summarise(count = n()) %>%
ungroup() %>%
spread(Race, count)
# # A tibble: 6 x 5
# Time Sex Black White `<NA>`
# <dbl> <chr> <int> <int> <int>
# 1 1 Female 1 NA NA
# 2 1 Male NA 1 NA
# 3 2 Male 1 NA NA
# 4 2 NA NA NA 1
# 5 3 Male 1 1 NA
# 6 NA NA NA NA 3
Если вы хотите использовать базу R:
df_list <- split(df, df$time)
lapply(df_list, function(x) table(x$race, x$sex))