Reputation: 1
I'm trying to generate a dataset in which I keep the changing the first column every three rows later and as I change the first column, the second and third column change with it as well. Example given below. I'm a little confused as to how I can achieve this with the nested for loop.
df = NULL
for (CDRID in 1:3)
{
for (STARTDATE in 20200517:20200519)
{
for (PRIIDENTITY in 4:6)
{
df1 = rbind(df, data.frame ( "CDR_ID"=CDRID, "START_DATE"=STARTDATE, "PRI_IDENTITY"=PRIIDENTITY)) }}}
Upvotes: 0
Views: 100
Reputation: 160862
df <- data.frame(ID=1:3, START_DATE=20200517:20200519, PRI_IDENTITY=4:6)
df[rep(seq_len(nrow(df)), each=3),]
# ID START_DATE PRI_IDENTITY
# 1 1 20200517 4
# 1.1 1 20200517 4
# 1.2 1 20200517 4
# 2 2 20200518 5
# 2.1 2 20200518 5
# 2.2 2 20200518 5
# 3 3 20200519 6
# 3.1 3 20200519 6
# 3.2 3 20200519 6
A thought: 20200517:20200519
, where I'm making an assumption that these are intended to be dates. This is fragile in that it doesn't know about wrapping days between months. In R, it might be better to use proper Date
objects. With that, try:
> df <- data.frame(ID=1:3, START_DATE=seq.Date(as.Date("2020-05-17"), as.Date("2020-05-19"), by="days"), PRI_IDENTITY=4:6)
Browse[2]> df[rep(seq_len(nrow(df)), each=3),]
ID START_DATE PRI_IDENTITY
1 1 2020-05-17 4
1.1 1 2020-05-17 4
1.2 1 2020-05-17 4
2 2 2020-05-18 5
2.1 2 2020-05-18 5
2.2 2 2020-05-18 5
3 3 2020-05-19 6
3.1 3 2020-05-19 6
3.2 3 2020-05-19 6
As akrun suggested, if you are using (or amenable to using) packages from the tidyverse, then instead of the rep(seq_len(...
part, you can do
# df <- data.frame(...)
tidyr::uncount(df, 3)
Upvotes: 2