2017-07-23 23 views
1

長格式我有一個數據幀如下從廣角與日期變量

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иut什麼都沒有發生

回答

1

這是一個選項。創建一個非NA'事件'('i1')的索引。然後使用該索引複製'df'行,指定i!is.na(event) & !duplicated(event)),分別將'end'和'fact1'分配給'event'和NA。然後將'begin'分配給shift ed'end',其中有duplicated'begin'

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