从带有Date变量的宽格式到长格式

时间:2017-07-23 17:43:48

标签: r

我有一个数据框如下

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来解决这个任务,并且没有发生任何事情

1 个答案:

答案 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