2017-03-17 62 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