2017-10-04 111 views
0

所以我有一個ID列表。爲每個R的每個ID添加一行R

我想爲列表中的每個ID創建一個表,每個月的每個月都包含行。

我試圖用rbind在for循環中,但是這需要永遠...這樣:

for (k in seq_along(members)) 
{ 
    for (i in seq(1,12)) 
    { 
    df1<-rbind(df1, data.frame(MemYearMo=paste(members[k],"_",year,formatC(i,width=2,flag=0), sep=""))) 
    } 
} 

,會員顯然是我的id的列表。

我的期望的輸出是: XXX_201701 XXX_201702 XXX_201703 。 。 。 XXX 201712

其中XXX是我的ID之一。

什麼是最快的方式來做這樣的事情?

回答

0

使用rep

id <- letters[1:10] 
month <- 201701:201712 
ids <- rep(ids, each=length(month)) 
months <- rep(months, length.out=length(id)) 
data.frame(id=ids, ym=months, id_ym = paste(ids, months, sep="_")) 

給出

id  ym id_ym 
1 a 201701 a_201701 
2 a 201702 a_201702 
3 a 201703 a_201703 
... 
+0

這簡單而優雅。謝謝! – ymyook

0

我不確定我是否理解了您的期望輸出,但是您可以使用expand.grid生成一年中月份的成員ID的不同組合。


df <- as.data.frame(expand.grid(members = 901:903, ym = 201701:201712)) 
df$MemYearMo <- paste(df$members, df$ym, sep = "_") 
df 
#> members  ym MemYearMo 
#> 1  901 201701 901_201701 
#> 2  902 201701 902_201701 
#> 3  903 201701 903_201701 
#> 4  901 201702 901_201702 
#> 5  902 201702 902_201702 
#> 6  903 201702 903_201702 
#> ...(and so on)... 
#> 34  901 201712 901_201712 
#> 35  902 201712 902_201712 
#> 36  903 201712 903_201712 
0

使用data.table和paste0你可以做到這一點,假設你的ID是唯一的。

id <- as.data.table(letters) 
id <- id[, .(output = paste0(letters, paste0("_2017", c(paste0(0, 1:9), 10:12)))), by = .(letters)] 
+0

或更加整齊,'formatC(1:12,寬度= 2,標誌= 0)'月號 – dww

+0

好的。或者使用markdly作爲靈感: 'id < - id [,。(輸出=粘貼(字母,201701:201712,sep =「_」)),by =。(letters)]' – falecomdino