2017-10-04 113 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