2016-07-06 68 views
1

我想堆疊數據幀的列並維護行名稱。這是一個例子。stack() - 如何在堆疊數據幀時保留行名稱

tod<-format(seq.POSIXt(as.POSIXct(Sys.Date()), as.POSIXct(Sys.Date()+1), by = "5 min"), 
      "%H:%M", tz="GMT") 
tod<-tod[1:length(tod)-1] 
dat <- data.frame(A = 1:length(tod), B = length(tod):1) 
colnames(dat)<-seq(as.Date('2015-05-01'), as.Date('2015-05-02'), by = 'day') 

rownames(dat)<-tod 

將會產生

  X2015.05.01 X2015.05.02 
00:00   1   288 
00:05   2   287 
00:10   3   286 
00:15   4   285 
00:20   5   284 
00:25   6   283 

我然後運行

dat<-stack(dat) 

它返回

values  ind 
1  1 2015-05-01 
2  2 2015-05-01 
3  3 2015-05-01 
4  4 2015-05-01 
5  5 2015-05-01 
6  6 2015-05-01 

是否有維持行名稱的方法嗎?

感謝您的任何幫助。

回答

1

行名稱必須是唯一的,所以沒有辦法在rownames複製tod時間一天的)。

我建議你把tod到其他列堆碼後:

new_dat <- stack(dat) 
new_dat$tod <- rep(tod, times = ncol(dat)) 

# values  ind tod 
#1  1 2015-05-01 00:00 
#2  2 2015-05-01 00:05 
#3  3 2015-05-01 00:10 
#4  4 2015-05-01 00:15 
#5  5 2015-05-01 00:20 
#6  6 2015-05-01 00:25 

如果您還有疑問,讓我們試着分配tod到rownames:

rownames(new_dat) <- new_dat$tod 
# Error in `row.names<-.data.frame`(`*tmp*`, value = value) : 
# duplicate 'row.names' are not allowed 

看到了嗎?我們得到錯誤。

+0

謝謝。這很棒 – Terno