2017-03-17 91 views
3

我想填充缺少的值在我的数据框中,但我不想要所有可能的变量组合 - 我只想填充基于三个变量的分组:课程代码,年份和星期。在data.frame中使用dplyr在组中完成填充缺失值

我看着成完整的()在tidyr库,但我不能得到它的工作,甚至在看Using tidyr::complete with group_byhttps://blog.rstudio.org/2015/09/13/tidyr-0-3-0/

我有收集给周一年在不同的观测数据后培训班。例如,数据可能会在我的较大数据集中收集1-10周,但我只关心特定课程年组合中发生的缺失周。 例如,

  • 在过程在年甲,数据收集在周1,图3和4
  • 我想知道第2周不见了。
  • 我不认为每周5缺少关心,即使有人在课程b,否则收集5周的数据,2000年

例子:

library(dplyr) 
library(tidyr) 

df <- data.frame(coursecode = rep(c("A", "B"), each = 6), 
       year = rep(c(2000, 2000, 2000, 2001, 2001, 2001), 2), 
       week = c(1, 3, 4, 1, 2, 3, 2, 3, 5, 3, 4, 5), 
       values = c(1:12), 
       othervalues = c(12:23), 
       region = "Big") 

df 

    coursecode year week values othervalues region 
1   A 2000 1  1   12 Big 
2   A 2000 3  2   13 Big 
3   A 2000 4  3   14 Big 
4   A 2001 1  4   15 Big 
5   A 2001 2  5   16 Big 
6   A 2001 3  6   17 Big 
7   B 2000 2  7   18 Big 
8   B 2000 3  8   19 Big 
9   B 2000 5  9   20 Big 
10   B 2001 3  10   21 Big 
11   B 2001 4  11   22 Big 
12   B 2001 5  12   23 Big 

尝试完成:(不是我期望的输出)

df %>% 
     complete(coursecode, year, region, nesting(week)) 

# A tibble: 20 x 6 
    coursecode year region week values othervalues 
     <fctr> <dbl> <fctr> <dbl> <int>  <int> 
1   A 2000 Big  1  1   12 
2   A 2000 Big  2  NA   NA 
3   A 2000 Big  3  2   13 
4   A 2000 Big  4  3   14 
5   A 2000 Big  5  NA   NA 
6   A 2001 Big  1  4   15 
7   A 2001 Big  2  5   16 
8   A 2001 Big  3  6   17 
9   A 2001 Big  4  NA   NA 
10   A 2001 Big  5  NA   NA 
11   B 2000 Big  1  NA   NA 
12   B 2000 Big  2  7   18 
13   B 2000 Big  3  8   19 
14   B 2000 Big  4  NA   NA 
15   B 2000 Big  5  9   20 
16   B 2001 Big  1  NA   NA 
17   B 2001 Big  2  NA   NA 
18   B 2001 Big  3  10   21 
19   B 2001 Big  4  11   22 
20   B 2001 Big  5  12   23 

所需的输出

coursecode year region week values othervalues 
     <fctr> <dbl> <fctr> <dbl> <int>  <int> 
1   A 2000 Big  1  1   12 
2   A 2000 Big  2  NA   NA 
3   A 2000 Big  3  2   13 
4   A 2000 Big  4  3   14 
5   A 2001 Big  1  4   15 
6   A 2001 Big  2  5   16 
7   A 2001 Big  3  6   17 
8   B 2000 Big  2  7   18 
9   B 2000 Big  3  8   19 
10   B 2000 Big  4  NA   NA 
11   B 2000 Big  5  9   20 
12   B 2001 Big  3  10   21 
13   B 2001 Big  4  11   22 
14   B 2001 Big  5  12   23 

回答

3

我们可以expand尝试left_join

library(dplyr) 
library(tidyr) 
df %>% 
    group_by(coursecode, year, region) %>% 
    expand(week = full_seq(week, 1)) %>% 
    left_join(., df) 
# coursecode year region week values othervalues 
#  <fctr> <dbl> <fctr> <dbl> <int>  <int> 
#1   A 2000 Big  1  1   12 
#2   A 2000 Big  2  NA   NA 
#3   A 2000 Big  3  2   13 
#4   A 2000 Big  4  3   14 
#5   A 2001 Big  1  4   15 
#6   A 2001 Big  2  5   16 
#7   A 2001 Big  3  6   17 
#8   B 2000 Big  2  7   18 
#9   B 2000 Big  3  8   19 
#10   B 2000 Big  4  NA   NA 
#11   B 2000 Big  5  9   20 
#12   B 2001 Big  3  10   21 
#13   B 2001 Big  4  11   22 
#14   B 2001 Big  5  12   23 
+1

你让我星期五下午值得停留有点晚了。谢谢!这很奇怪--dplyr为您编写的代码提供了一个进度条,并且不适用于本周早些时候在http://stackoverflow.com/questions/42725428/how-to-add-progress-bar-inside上编写的代码-dplyr-chain-in-r ...奇怪为什么。 – Nova

+0

@JakeKaupp OP已经用'complete'尝试过了,但没有成功 – akrun