将起始时间间隔重新设置为R中的较小间隔

时间:2015-06-16 16:56:40

标签: r apply reshape seq

这是按时间间隔的持续时间数据。

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的$ value。对于另一个案例= 0。

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

我在1001列中创建了日期框架。我知道如何为行创建序列,但是我在将此seq实现到表中时遇到了麻烦。

r中的哪位操作员帮助我?任何想法在哪里开始点这个?非常感谢您的帮助。

我希望这个例子足够清楚,否则请告诉我,我会尝试进一步澄清。

预期输出是1001列内的数据帧,其中第一个的名称= id,从秒到最后=从1到1000的数字。对于每个唯一的id,我们应该在列名=时间间隔时从$ value添加值(数字从$ start到$ end)

1 个答案:

答案 0 :(得分:0)

&#39; start&#39;中的一个值是&#39; 0&#39;。因此,我更改为&#39; 1&#39;,在&#中创建了1000列和6行(length unique个元素的矩阵(&#39; m1&#39;) 39; id&#39;列)。使用Map,为每个&#39;开始&#39;&#39;结束&#39;创建序列。值,输出为list(&#39; lst&#39;)。我们rbind&#39;}&#39;} (&#39; d2&#39;),使用基于来自&#39; d2&#39;的值的row/column索引,我们替换了&#39; m1&#39;中的NA值。有价值的&#39;根据&#39; nrow&#39;复制的列。每个&#39;元件。

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))