将开始结束时间间隔重塑为 R 中的较小间隔
Reshape start-end time intervals to smaller intervals in 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 列内将以下数据转换为 table 格式(第一个 = id,列从 1 到 1000)。拆分间隔。
将持续时间数据转换为 "check point" 格式。为每个 id 创建行,其中持续时间序列与列名一致应该是 $id 的 $value。对于另一种情况 = 0.
d <- data.frame(matrix(ncol = 1001, nrow = 1))
colnames(d) <- c("id", 1:1000)
dim(d)
[1] 1 1001
我在 1001 列中创建了日期框。我知道如何为行创建序列,但我无法将此序列实现到 table.
r 中的哪个运算符可以帮助我?任何想法从哪里开始?非常感谢您的帮助。
我希望这个例子足够清楚,否则请告诉我,我会尝试进一步阐明。
预期输出是 1001 列内的数据框,其中第一个的名称 = id,从第二个到最后一个 = 从 1 到 1000 的数字。对于每个唯一的 id,当列的名称 = 时间时,我们应该从 $value 添加值间隔(从 $start 到 $end 的数字)
'start' 中的一个值为“0”。因此,我更改为“1”,创建了一个 1000 列和 6 行的矩阵 ('m1')('id' 列中 unique
个元素的 length
。使用 Map
,为每个 'start'、'end' 值创建一个序列,输出是一个 list
('lst')。我们 rbind
'lst' ('d2'),使用基于 'd2' 的值的 row/column
索引,我们将 'm1' 中的 NA 值替换为 'value' 基于每个 'lst' 元素的 '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))
这是按时间间隔划分的持续时间数据。
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 列内将以下数据转换为 table 格式(第一个 = id,列从 1 到 1000)。拆分间隔。
将持续时间数据转换为 "check point" 格式。为每个 id 创建行,其中持续时间序列与列名一致应该是 $id 的 $value。对于另一种情况 = 0.
d <- data.frame(matrix(ncol = 1001, nrow = 1))
colnames(d) <- c("id", 1:1000)
dim(d)
[1] 1 1001
我在 1001 列中创建了日期框。我知道如何为行创建序列,但我无法将此序列实现到 table.
r 中的哪个运算符可以帮助我?任何想法从哪里开始?非常感谢您的帮助。
我希望这个例子足够清楚,否则请告诉我,我会尝试进一步阐明。
预期输出是 1001 列内的数据框,其中第一个的名称 = id,从第二个到最后一个 = 从 1 到 1000 的数字。对于每个唯一的 id,当列的名称 = 时间时,我们应该从 $value 添加值间隔(从 $start 到 $end 的数字)
'start' 中的一个值为“0”。因此,我更改为“1”,创建了一个 1000 列和 6 行的矩阵 ('m1')('id' 列中 unique
个元素的 length
。使用 Map
,为每个 'start'、'end' 值创建一个序列,输出是一个 list
('lst')。我们 rbind
'lst' ('d2'),使用基于 'd2' 的值的 row/column
索引,我们将 'm1' 中的 NA 值替换为 'value' 基于每个 'lst' 元素的 '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))