2017-06-05 61 views
0

我需要基於分組填寫基於先前值和/或前向值的缺失值。我想用dplyr完成這個工作(雖然data.table解決方案也會受到歡迎)。基於滯後分組值確定缺失值

的樣本數據:

testing <- tibble(key = c(10,10,10,10,10,10,20,20,20,20,20,20), 
        year = c(15,15,16,16,17,17,15,15,16,16,17,17), 
        name = c("abc","abc","","","dfg","dfg", 
          "","","nmm","nmm","",""), 
        is_name = c(1,1,0,0,1,1,0,0,0,0,0,0)) 

    key year name is_name 
    <dbl> <dbl> <chr> <dbl> 
1  10 15 abc  1 
2  10 15 abc  1 
3  10 16    0 
4  10 16    0 
5  10 17 dfg  1 
6  10 17 dfg  1 
7  20 15    0 
8  20 15    0 
9  20 16 nmm  0 
10 20 16 nmm  0 
11 20 17    0 
12 20 17    0 

我要填寫的方式丟失的名稱(name)如果同一key以前year被標記爲is_name==1,比填充它缺少的。 所以輸出可以是:

 key year name is_name name_new 
    <dbl> <dbl> <chr> <dbl> <chr> 
1  10 15 abc  1  abc 
2  10 15 abc  1  abc 
3  10 16    0  abc 
4  10 16    0  abc 
5  10 17 dfg  1  dfg 
6  10 17 dfg  1  dfg 
7  20 15    0   
8  20 15    0   
9  20 16 nmm  0  nmm 
10 20 16 nmm  0  nmm 
11 20 17    0   
12 20 17    0 

我試圖用lagleap,但它並沒有超越集團(key)正確。

謝謝!

+0

'從'zoo'包na.locf'的工作是你正在尋找 – Jaap

+0

@Jaap我已經準備使用的答案是什麼'na.locf',然後看到你的評論。我應該發佈還是打算髮布自己的? –

回答

1

這可能會爲你

library(dplyr) 
library(zoo) 

testing <- testing %>% 
      arrange(key, year) %>% 
      mutate(name = ifelse(name == "", NA, name), 
        is_name = ifelse(is_name == 0, NA, is_name)) %>% 
      group_by(key) %>% 
      mutate(newname = ifelse((is.na(name) & na.locf(is_name, na.rm = FALSE) == 1), na.locf(name, na.rm = FALSE), name), 
        is_name = ifelse(is.na(is_name),0,is_name)) 
+0

我所需要的,現在我將在我的問題中進行編輯,正是這樣,但是基於前一組的條件 - 即只有在「is_name == 1」時才比我想要做的更好。 –

+0

我更新了我的答案,並提供了可用於提供該功能的更改。 –

+0

謝謝。第9行和第10行現在是NAs,但它們應該具有值。 –