2017-10-06 56 views
1

我現在有一個數據集,看起來像下面這樣:級聯看重下來tibble

library(tidyverse) 
tribble(~urn, ~year, ~retained, ~retained_years, 
     1, 2010, 0, 0, 
     1, 2011, 1, 1, 
     1, 2012, 1, 2, 
     1, 2013, 1, 3, 
     1, 2014, 1, 4, 
     2, 2010, 0, 0, 
     2, 2011, 1, 1, 
     2, 2013, 0, 0, 
     2, 2014, 1, 1) 

# # A tibble: 9 x 4 
#  urn year retained retained_years 
# <dbl> <dbl> <dbl>   <dbl> 
# 1  1 2010  0    0 
# 2  1 2011  1    1 
# 3  1 2012  1    2 
# 4  1 2013  1    3 
# 5  1 2014  1    4 
# 6  2 2010  0    0 
# 7  2 2011  1    1 
# 8  2 2013  0    0 
# 9  2 2014  1    1 

我想補充使用dplyr創建與最小的一年填充了一組新列ret_year_start列其中retained = 1的值的記錄。結果看起來像下面的數據集。

# # A tibble: 9 x 5 
#  urn year retained retained_years ret_year_start 
# <dbl> <dbl> <dbl>   <dbl>   <dbl> 
# 1  1 2010  0    0    NA 
# 2  1 2011  1    1   2011 
# 3  1 2012  1    2   2011 
# 4  1 2013  1    3   2011 
# 5  1 2014  1    4   2011 
# 6  2 2010  0    0    NA 
# 7  2 2011  1    1   2011 
# 8  2 2013  0    0    NA 
# 9  2 2014  1    1   2014 

我試着用不同的東西分組,但它是沒有這麼多的分組而設定的,我想設置一個起始年的序列。

我知道這不是一個代碼診斷問題,因爲它是一個代碼詞彙問題。由「運行」和從「保持」 data.table遊程長度-ID(rleid,和

回答

1

我們組獲取對應於保持用1

library(dplyr) 
library(data.table) 
df1 %>% 
    group_by(urn, grp = rleid(retained)) %>% 
    mutate(ret_year_start = year[which(retained==1)[1]]) 
# A tibble: 9 x 6 
# Groups: urn, grp [6] 
# urn year retained retained_years grp ret_year_start 
# <dbl> <dbl> <dbl>   <dbl> <int>   <dbl> 
#1  1 2010  0    0  1    NA 
#2  1 2011  1    1  2   2011 
#3  1 2012  1    2  2   2011 
#4  1 2013  1    3  2   2011 
#5  1 2014  1    4  2   2011 
#6  2 2010  0    0  3    NA 
#7  2 2011  1    1  4   2011 
#8  2 2013  0    0  5    NA 
#9  2 2014  1    1  6   2014 

第一元件位置的「年」

或用data.table

library(data.table) 
setDT(df1)[, ret_year_start := year[which(retained==1)[1]], .(rleid(retained), urn)] 
+1

我知道這是一個詞彙的問題。在'rleid'功能一個我還沒有遇到過的。我懷疑這是值得進一步研究。 – Dan