有四个时间间隔
[0, 3), [3, 10), [10, 12), and [12, Inf)
和我们有生存时间的三个科目
10.3, 0.7, 12.2
我想构建一个包含三行(每个人一个)和四列(每个时间间隔一个)的矩阵,其中包含每个时间间隔内每个人所花费的时间。
对于这个特例,我们有
3.0 7 0.3 0.0
0.7 0 0.0 0.0
3.0 7 2.0 0.2
你能帮助我在R
中获得这个吗?我们的想法是将此应用于大于3的N.
我的尝试:
breaks <- c(0, 3, 10, 12, Inf) # interval break points
M <- length(breaks) - 1 # number of intervals
time <- c(10.3, 0.7, 12.2) # observed survival times
N <- length(time) # number of subjects
timeSpent <- matrix(NA, nrow=N, ncol=M)
for(m in 1:M)
{
ind <- which(breaks[m + 1] - time > 0)
timeSpent[ind, m] <- time[ind] - breaks[m]
timeSpent[-ind, m] <- breaks[m + 1] - breaks[m]
}
timeSpent <- replace(x=timeSpent, list=timeSpent < 0, values=0)
答案 0 :(得分:1)
breaks <- c(0, 3, 10, 12, Inf)
time <- c(10.3, 0.7, 12.2)
timeSpent <- sapply(time, function(x) {
int <- max(which(x>breaks))
res <- diff(breaks)
res[int:length(res)] <- 0
res[int] <- x-breaks[int]
res
})
t(timeSpent)
# [,1] [,2] [,3] [,4]
#[1,] 3.0 7 0.3 0.0
#[2,] 0.7 0 0.0 0.0
#[3,] 3.0 7 2.0 0.2
答案 1 :(得分:1)
这不会循环,应该更快。但是,潜在的问题可能是内存需求。
tmp <- t(outer(time, breaks, ">"))
res <- tmp * breaks
res[is.na(res)] <- 0
res <- diff(res)
res[diff(tmp)==-1] <- time+res[diff(tmp)==-1]
t(res)
# [,1] [,2] [,3] [,4]
#[1,] 3.0 7 0.3 0.0
#[2,] 0.7 0 0.0 0.0
#[3,] 3.0 7 2.0 0.2