2012-12-04 48 views
2

我一個數據集看起來像這樣,除了有更多的列中包含「串行」和「祿」數據的工作:如何將數據組合爲單行?

start <-c(1,8,16,24,28,32) 
end <-c(4,9,20,27,30,45) 
serial<-c(1,2,3,4,5,6) 
loc<-c(8,63,90,32,89,75) 
dataset<-data.frame(cbind(start,end, serial,loc)) 

這裏的每一行實際上代表了連續的整數的運行;我想將每個連續的整數都放到它自己的行中,並保存該行的其他屬性。 「開始」表示運行的開始,「結束」表示運行的結束。因此,例如,在「數據集」的第一行中,我希望將該行分成四行:一列爲1,一列爲2,一列爲3,另一行爲4。同樣,第二行在「數據集」將被分成兩行:一個用於8,一個用於9等

因此,輸出用於運行剛剛的前兩行‘數據集’將如下所示:

split serial loc 
    1 1 8 
    2 1 8 
    3 1 8 
    4 1 8 
    8 2 63 
    9 2 63 

回答

1

這裏有一個方法與基地R.

temp <- mapply(seq, dataset$start, dataset$end) 
dataset2 <- data.frame(serial = rep(dataset$serial, sapply(temp, length)), 
         index = unlist(temp), 
         loc = rep(dataset$loc, sapply(temp, length))) 
list(head(dataset2), tail(dataset2)) 
# [[1]] 
# serial index loc 
# 1  1  1 8 
# 2  1  2 8 
# 3  1  3 8 
# 4  1  4 8 
# 5  2  8 63 
# 6  2  9 63 
# 
# [[2]] 
# serial index loc 
# 27  6 40 75 
# 28  6 41 75 
# 29  6 42 75 
# 30  6 43 75 
# 31  6 44 75 
# 32  6 45 75 
3

data.table溶液假定串行是唯一的行標識符

library(data.table) 
DA <- as.data.table(dataset) 
DB <- DA[,list(index = seq(start,end, by = 1), loc),by = serial] 

如果serial是不是唯一的行標識符,則

DB <- DA[, list(index = seq(start,end, by = 1), loc, serial), by = list(rowid = seq_len(nrow(DA)))] 
0
# create the ranges 
ranges <- mapply(seq, dataset$start, dataset$end) 

# create the tables 
tables <- lapply(seq(ranges), function(i) 
      cbind(split=ranges[[i]], dataset[i, c("serial", "loc")])) 

# to put all the tables in one matrix: 
do.call(rbind, tables) 
+0

堅持使用適用於'data.frame'不是特別安全,因爲它會強制到相同類型的矩陣。我不明白第二行是如何做OP的。 (或者我誤解) – mnel

+0

@ mnel,第二行有錯誤,現在已修復。感謝您使用'apply'和數據框指出問題。我沒有意識到,雖然它確實有道理。它是否總是強制進入矩陣(即僅僅通過使用apply)或僅當「FUN」需要這種行爲時? –

+0

它將始終強制爲矩陣(或數組,但對於data.frame不可能)。查看源代碼,行是'if(is.object(X)) {X < - if(dl == 2L){as.matrix(X)} else else as.array(X)}}' – mnel