【问题标题】:Create rows to fill missing values grouping by date创建行以填充按日期分组的缺失值
【发布时间】:2020-04-18 12:21:05
【问题描述】:

假设我有这样一个数据框。

这里有人员、周数和一个数周累积的数字。

    df <- tribble(
  ~week, ~author, ~n,
  "W1",  "John", 1,
  "W1",  "Jack", 2,
  "W2",  "John", 2,
  "W2",  "Annie", 3,
  "W2",  "Peter", 1,
  "W3",  "Annie", 4,
  "W3",  "John",  3,
  "W3",  "Jack", 3
)

现在,我想做的是 group_by week,并且每周都有所有作者(Jack、John、Annie 和 Peter),保留上周的数量,以防没有加起来。

我想我可以使用complete() 或fill() 来保留上周的数字,在sort(df, week, author) 之后,但我不明白如何添加作者,以防那周他们没有产生任何东西.

这是我希望看到的结果

df <- tribble(
  ~week, ~author, ~n,
  W1,  "John", 1,
  W1,  "Jack", 2, 
  W1,  "Annie", 0,
  W1,  "Peter", 0,
  W2,  "John", 2,
  W2,  "Annie", 3,
  W2,  "Peter", 1,
  W2,  "Jack", 2
  W3,  "Annie", 4,
  W3,  "John",  3,
  W3,  "Jack", 3,
  W3,  "Peter", 1
)

谢谢!

【问题讨论】:

  • 好的,谢谢指出,我会修改的!

标签: r tidyverse


【解决方案1】:

我们可以先将complete 缺少的author 从每个week、fill 中使用先前的值和replace NA 的值设置为0。

library(dplyr)
library(tidyr)

df %>%
  complete(week, author) %>%
  group_by(author) %>%
  fill(n) %>%
  mutate(n = replace_na(n, 0))


#   week  author     n
#   <chr> <chr>  <dbl>
# 1 W1    Annie      0
# 2 W1    Jack       2
# 3 W1    John       1
# 4 W1    Peter      0
# 5 W2    Annie      3
# 6 W2    Jack       2
# 7 W2    John       2
# 8 W2    Peter      1
# 9 W3    Annie      4
#10 W3    Jack       3
#11 W3    John       3
#12 W3    Peter      1

【讨论】:

  • 非常感谢!有趣的是,在我的代码中,这以一种奇怪的方式工作:我有 1s 而不是 NAs 用于新字段,并且它正在逐步总结。也许那是因为我的周专栏是date,不确定。我稍微调整了一下,效果很好:group_by(df, week, author) %&gt;% count() %&gt;% group_by(author) %&gt;% mutate (cumText = cumsum(n))
猜你喜欢
  • 2020-12-07
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多