1
employee <- c("John", "Adi", "Sam")
salary <- c(21000, 22000, 23000)
startdate <- as.Date(c("2014-11-01","2014-01-01","2014-10-01"))
enddate <- as.Date(c("2015-10-31","2014-12-31","2015-10-31"))
N<- c(2,1,2)
df<- data.frame(employee,salary, startdate, enddate, N)

我想将整行重复“n”次,其中在N列中指定了“n”,但我想将原始行中的enddate更改为固定日期,例如“31/12/2014”并制作这个固定日期作为重复行中的开始日期。运行代码以查看df2中的结果示例(预期输出) :

employee <- c(rep("John",2), "Adi", rep("Sam",2))
salary <- c(21000,21000, 22000, 23000,23000)
startdate <- as.Date(c("2014-11-01","2014-12-31", "2014-01-01","2014-10-01","2014-12-31"))
enddate <- as.Date(c("2014-12-31","2015-10-31","2014-12-31","2014-12-31","2015-10-31"))
N<- c(2,2,1,2,2)
df2<- data.frame(employee,salary, startdate, enddate, N)
4

1 回答 1

0

我们可以使用data.table. 我们将“data.frame”转换为“data.table”(setDT(df)),通过复制“N”变量来扩展行。我们得到按“员工”分组的观察(.I[1L])的数字索引(“i1”),用它来分配(:=)“结束日期”和“2014-12-31”。同样,我们为每个“员工”获取倒数第二个元素 ( ) 的行索引 (“i2”),.I[seq_len(.N)>1L]并将“开始日期”设置为“2014-12-31”。

DT <- setDT(df)[rep(seq_len(.N), N)]
i1 <- DT[,  .I[1L] , by = employee]$V1
DT[i1, enddate:= as.Date('2014-12-31')]
i2 <- DT[, .I[seq_len(.N)>1L], employee]$V1
DT[i2, startdate:= as.Date('2014-12-31')]
identical(as.data.table(df2), DT)
#[1] TRUE

或者我们可以使用if并连接“startdate”和“enddate”的“2014-12-31”,按“employee”分组,然后将输出分配回“startdate”、“enddate”列。

DT[, c('startdate', 'enddate') := if(.N>1L) 
            list(c(startdate[1L], as.Date('2014-12-31')),
                 c(as.Date('2014-12-31'), enddate[.N])) , by = employee]
identical(DT, as.data.table(df2))
#[1] TRUE
于 2015-09-01T10:11:23.853 回答