r - 使用 dplyr 将行添加到分组数据中?

标签 r dataframe dplyr

我的数据采用 data.frame 格式,如以下示例数据:

data <- 
structure(list(Article = structure(c(1L, 1L, 3L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L
), .Label = c("10004", "10006", "10007"), class = "factor"), 
Demand = c(26L, 780L, 2L, 181L, 228L, 214L, 219L, 291L, 104L, 
72L, 155L, 237L, 182L, 148L, 52L, 227L, 2L, 355L, 2L, 432L, 
1L, 156L), Week = c("2013-W01", "2013-W01", "2013-W01", "2013-W01", 
"2013-W01", "2013-W02", "2013-W02", "2013-W02", "2013-W02", 
"2013-W02", "2013-W03", "2013-W03", "2013-W03", "2013-W03", 
"2013-W03", "2013-W04", "2013-W04", "2013-W04", "2013-W04", 
"2013-W04", "2013-W04", "2013-W04")), .Names = c("Article", 
"Demand", "Week"), class = "data.frame", row.names = c(NA, -22L))

我想按周和文章总结需求栏。为此,我使用:
library(dplyr)
WeekSums <- 
  data %>%
   group_by(Article, Week) %>%
   summarize(
    WeekDemand = sum(Demand)
   )

但由于某些文章在某些周内未售出,因此每篇文章的行数不同(WeekSums 数据框中仅显示销售周数)。我如何调整我的数据,以便每篇文章都有相同的行数(每周一个),包括需求为 0 的周数?

输出应如下所示:
  Article     Week WeekDemand
1   10004 2013-W01       1215
2   10004 2013-W02        900
3   10004 2013-W03        774
4   10004 2013-W04       1170
5   10006 2013-W01        0
6   10006 2013-W02        0
7   10006 2013-W03        0
8   10006 2013-W04         5
9   10007 2013-W01         2
10   10007 2013-W02        0
11   10007 2013-W03        0
12   10007 2013-W04        0

我试过
WeekSums %>%
  group_by(Article) %>%
  if(n()< 4) rep(rbind(c(Article,NA,NA)), 4 - n() )

但这不起作用。在我最初的方法中,我通过将第 1-4 周的数据框与每篇文章的原始数据文件合并来解决这个问题。这样,我每篇文章有 4 周(行),但是使用 for 循环的实现效率非常低,所以我尝试使用 dplyr(或任何其他更高效的包/函数)做同样的事情。我们欢迎所有的建议!

最佳答案

没有 dplyr 可以这样做:

as.data.frame(xtabs(Demand ~ Week + Article, data))

给予:
       Week Article Freq
1  2013-W01   10004 1215
2  2013-W02   10004  900
3  2013-W03   10004  774
4  2013-W04   10004 1170
5  2013-W01   10006    0
6  2013-W02   10006    0
7  2013-W03   10006    0
8  2013-W04   10006    5
9  2013-W01   10007    2
10 2013-W02   10007    0
11 2013-W03   10007    0
12 2013-W04   10007    0

这可以重写为 magrittr 或 dplyr 管道,如下所示:
data %>% xtabs(formula = Demand ~ Week + Article) %>% as.data.frame()
as.data.frame()如果需要宽形式的解决方案,最后可以省略。

关于r - 使用 dplyr 将行添加到分组数据中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451372/

相关文章:

string - 在 r 中编辑(即从中删除字符)矩阵的列名时,是否有与 paste() 相反的函数?

pandas - Pandas DataFrame如何查询最近的日期时间索引?

python - 从今天的日期中减去 pandas Dataframe 的值

r - 如何修复损坏的 grouped_df?

基于时间间隔和键的年份 R 聚合

R:将字符串快速散列为整数模 n?

r - 如何在 igraph 中绘制节点大小的网络度、x 轴的特征向量以及 y 轴的属性?

r - 按特定(自定义)顺序对整数向量进行排序

r - 如何使用 Spark Dataframe API 对 Case-Otherwise 语句应用多个条件

r - 在 R 中创建唯一的随机组 ID