首页 > 解决方案 > 在 R 中汇总数据并添加不同的变异

问题描述

我想在数据清理后最后总结一下我的数据。

这是我的数据结构:

structure(list(ID = structure(c(1L, 3L, 4L, 2L, 2L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("01002", 
"01004", "01005", "01006", "01009", "01011"), class = "factor"), 
    date = structure(c(17645, 17645, 17645, 17646, 17646, 17646, 
    17646, 17646, 17646, 17646, 17648, 17646, 17648, 17646, 17648, 
    17646, 17646, 17646, 17649, 17646), class = "Date"), category = structure(c(1L, 
    1L, 1L, 2L, 4L, 7L, 3L, 3L, 1L, 6L, 6L, 6L, 7L, 7L, 7L, 6L, 
    2L, 5L, 3L, 3L), .Label = c("A", "B", "C", "D", "F", "G", 
    "Q"), class = "factor"), level = c(3000, 3000, 1000, 1000, 
    1000, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 8000, 9999, 
    9999, 9999, 300, 300, 300, 9999)), class = "data.frame", row.names = c(NA, 
-20L))

这是我到目前为止的代码:

dataDF %>% 
  dplyr::group_by(category) %>% 
  dplyr::summarize(n = n()) %>%
  dplyr::mutate(percentage = (prop.table(n))*100) %>%
  arrange(desc(n))

结果如下:

  category     n percentage
  <fct>    <int>      <dbl>
1 A            4         20
2 C            4         20
3 G            4         20
4 Q            4         20
5 B            2         10
6 D            1          5
7 F            1          5

现在我想添加一个包含日期聚合的新列。

我需要为每个类别添加每个 ID 的平均计数日期。

以下是数据的外观(随机数,未计算)。

  category     n percentage mean_reported_days_per_ID
  <fct>    <int>      <dbl>    <int> 
1 A            4         20     2
2 C            4         20     3.4
3 G            4         20     4
4 Q            4         20     1
5 B            2         10     3.5
6 D            1          5     2
7 F            1          5     1.1

我不确定如何实现。我尝试添加另一个 mutate() 并计算每个 ID 的平均天数并将其(与另一个分组依据)添加到数据表中。

谢谢你的帮助!

标签: rdataframedplyrsummary

解决方案


您想要每个类别的每个 ID 的平均唯一日期吗?

你只需要分组和总结两次:

require(dplyr)

dataDF %>% 
  group_by(ID, category) %>%
  summarise(distinctDates = n_distinct(date)) %>% 
  group_by(category) %>% 
  summarise(mean(distinctDates))
  
#   category `mean(distinctDates)`
#   <fct>                    <dbl>
# 1 A                         1.33
# 2 B                         1   
# 3 C                         1   
# 4 D                         1   
# 5 F                         1   
# 6 G                         1   
# 7 Q                         1 

如果您想将这些值加入您现有的 DF,只需执行 left_join(your.existing.df, this.new.df, by = "category")


推荐阅读