2015-06-16 175 views
1

這裏是按時間間隔的持續時間數據。在R中將開始結束時間間隔更改爲更小的間隔

id <- c("A", "B", "B", "B", "C", "C", "D", "E", "F", "F", "F", "F") 
start <- c(368, 200, 230, 788, 230, 521, 272, 306, 0, 162, 337, 479) 
end <- c(373.98, 229.98, 233.98, 842.98, 239.98, 639.98, 285.98, 
     306.98, 95.98, 162.98, 339.98, 539.98) 
value <- c(20, 24, 24, 24, 19, 19, 100, 1, 8, 8, 8, 8) 
dt <- data.frame(id, start, end, value) 
head(dt) 
    id start end value 
1 A 368 373.98 20 
2 B 200 229.98 24 
3 B 230 233.98 24 
4 B 788 842.98 24 
5 C 230 239.98 19 
6 C 521 639.98 19 

我想將以下數據轉換爲1001列內的表格格式(第一個= id和列從1到1000)。拆分間隔。

將持續時間數據轉換爲「檢查點」格式。爲每個ID創建行,其中列名稱的持續時間序列應該是$ id的$值。對於另一種情況= 0.

d <- data.frame(matrix(ncol = 1001, nrow = 1)) 
colnames(d) <- c("id", 1:1000) 
dim(d) 
[1] 1 1001 

我在1001列內創建了日期幀。我知道如何爲行創建序列,但是我無法將這個序列實現到表中。

r中的哪個運算符可以幫助我?任何想法是從哪裏開始的?非常感謝您的幫助。

我希望這個例子足夠清楚,否則請讓我知道,我會盡力進一步澄清。

預期的輸出是1001列內的數據幀,其中第一個的名稱= id,從第二個到最後一個=數字從1到1000.對於每個唯一的id,當列名稱=時間間隔時,我們應該從$ value中添加值(數字從$ start到$ end)

+2

對預期輸出不清楚。 – user227710

+0

對於第一行即。對於ID'A',我猜測值'20'從第368列填充到第373或第374列?對於ID,'B',你有多個範圍應該相應填充 – akrun

+0

@akrun,填充到373 – moseno

回答

0

'start'中的一個值是'0'。所以,我改爲'1',創建了1000列和6行('id'列中的unique元素的length)的矩陣('m1')。使用Map爲每個「開始」,「結束」值創建了一個序列,輸出爲list('lst')。我們rbind'lst'('d2'),使用row/column基於來自'd2'的值進行索引,我們用'值'列替換'm1'中的NA值,該值是根據每個'lrow'的'nrow' '元素。

dt$start[9] <- 1 
m1 <- matrix(ncol=1000, nrow=length(unique(dt$id)), 
    dimnames=list(unique(dt$id), paste0('id', 1:1000))) 
lst <- Map(function(x,y,z) data.frame(id=z, Col=seq(x,y)) , 
       dt$start, trunc(dt$end), dt$id) 
d2 <- do.call(rbind, lst) 
m1[cbind(as.numeric(d2$id), d2[,2])] <- rep(dt$value,sapply(lst, nrow)) 
+1

非常感謝你,它的工作原理!以逃避NA我用:m1 [is.na(m1)] < - 0 – moseno

+0

我該如何填寫0值?從0到999. – moseno

+0

@moseno對不起,我不明白你的問題。你可以用相關信息更新你的文章,也可以作爲一個新問題發佈(這會更合適)? – akrun

相關問題