我有一个数据框如下
begin = c('01.01.2015', '01.03.2015')
event = c('01.06.2015', NA)
end = c('01.07.2015', '01.12.2015')
fact1 = c('a', 'b')
fact2 = c('d', 'c')
df = as.data.frame(cbind(begin, event, end, fact1, fact2))
df[, c('begin', 'event', 'end')] <- lapply(df[, c('begin', 'event', 'end')], as.Date, format="%d.%m.%Y")
df[, c('begin', 'event', 'end')] <- lapply(df[, c('begin', 'event', 'end')], as.Date, origin="1970-01-01")
df
begin event end fact1 fact2
1 2015-01-01 2015-06-01 2015-07-01 a d
2 2015-03-01 <NA> 2015-12-01 b c
我想获得一个像这样的数据框
begin end fact1 fact2
1 2015-01-01 2015-06-01 NA d
1 2015-06-01 2015-07-01 a d
2 2015-03-01 2015-12-01 b c
在event = NA
没有变化的行中。
在event
为日期的行中,我需要在此新行中添加新行,event
变为begin
。在“旧”行event
变为end
。
此外,一些变量保持不变(fact2),还有一些变化:fact1
属于event
之后发生的事情
我尝试用reshape2
来解决这个任务,并且没有发生任何事情
答案 0 :(得分:1)
这是一个选项。创建非NA&#39;事件的索引&#39; (&#39; I1&#39)。然后复制&#39; df&#39;使用该索引,指定i
(!is.na(event) & !duplicated(event)
),指定&#39; end&#39;和&#39; fact1&#39;事件&#39;和NA分别。然后分配&#39;开始&#39;到shift
ed&#39; end&#39;哪里有duplicated
&#39;开始&#39;
library(data.table)
i1 <- !is.na(df$event)
setDT(df[rep(seq_len(nrow(df)), i1+1),])[!is.na(event) & !duplicated(event),
c('end', 'fact1') := .(event, NA)][, event := NULL
][, end1 := shift(end)][duplicated(begin), begin := end1
][, end1 := NULL][]
# begin end fact1 fact2
#1: 2015-01-01 2015-06-01 NA d
#2: 2015-06-01 2015-07-01 a d
#3: 2015-03-01 2015-12-01 b c