R-汇总和计数分组实例

时间:2020-09-03 08:31:00

标签: r tidyverse

数据集是对响应者及其在给定时间段内拥有的联系数量以及其年龄范围的详细信息的细分,类似于:

participant    participant_age      contact      contact_age
     1               18-30             1            18-30
     1               18-30             2            30-40
     2               30-40             1            18-30
     3               18-30             1            18-30
     3               18-30             2            50-60

我的目标是计算每个年龄段的参与者与每个年龄段的接触的平均数量。类似于:

   age_bracket   18-30    30-40    40-50
      18-30        1        3        2
      30-40        1.5      4        2
      40-50        3        4        1

我一直在尝试使用dplyr中可用的group_by和spread函数。我最近来的人正在使用

data%>%
  group_by(participant_age, contact_age) %>%
  tally() %>%
  spread(key = participant_age, value = n)

但这会产生每个联系人的总数(n),而不是每个年龄段的平均联系人数量。

3 个答案:

答案 0 :(得分:0)

如果我正确理解了您的目标,那么您已经接近正确的解决方案:

data %>%
 group_by(participant_age, contact_age) %>%
 summarise(mean = mean(contact), .groups = "drop") %>%
 spread(key = participant_age, value = mean)

答案 1 :(得分:0)

在基数R中使用tapply

t(with(dat, tapply(contact, list(contact_age, participant_age), mean)))
#       18-30 30-40 50-60
# 18-30     1     2     2
# 30-40     1    NA    NA

数据:

dat <- structure(list(participant = c(1L, 1L, 2L, 3L, 3L), participant_age = c("18-30", 
"18-30", "30-40", "18-30", "18-30"), contact = c(1L, 2L, 1L, 
1L, 2L), contact_age = c("18-30", "30-40", "18-30", "18-30", 
"50-60")), class = "data.frame", row.names = c(NA, -5L))

答案 2 :(得分:0)

您可以使用pivot_wider并传递要在values_fn中应用的功能:

tidyr::pivot_wider(df, names_from = contact_age, values_from = contact, values_fn = mean)