r语言 - 从时间到事件值的矩阵



我有下一个矩阵:

structure(c(0, 0, NA, NA, NA, NA, 0, 0, NA, NA, NA, 1, NA, NA, 
NA, NA, 0, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 
1, 0, NA, NA, NA, NA, NA, 0, NA, NA, NA, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, 0, 
1, 1, 0, NA, NA, 0, 1, 1, NA, 1, 0, 0, 0, NA, NA, 0, 1, 1, 0, 
0, 1, 0, 0, 0, 0, 1, 1, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, 
NA, 1, 0, 1, 1, NA, NA, 0, 1, 1, 1, 0, 1, 0, NA, NA, NA, NA, 
NA, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, 
NA, 0, 1, NA, NA, 0, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 
1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, NA, 0, 1, NA, NA, 
1, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 0, NA, NA, 1, 
1, NA, NA, 1, 0, NA, 1, NA, NA, 1, 1, NA, NA, NA, NA, 0, NA, 
NA, NA, NA, NA), dim = c(30L, 7L), dimnames = list(c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", 
"26", "27", "28", "29", "30"), c("1", "2", "4", "5", "6", "7", 
"8")))

我需要以如下方式生成一个矩阵:

让我们假设这个矩阵的一行:

0,1,1,1,1,1,1

我想定义:

-1,0,1,2,3,4,5,6

其中0表示感兴趣事件的时间。

如果我有带有NA的元素,我希望得到这样的内容:

NA,NA,0,1,NA,NA,1

我想要得到:

NA,NA,-1,0,NA,NA,3

用这样的行:

NA,1,1,1,NA,NA,1

NA,0,1,2,NA,NA,5

我希望这些细节能澄清我的目标:

使用max.col,sequence和矩阵索引的矢量化解决方案:

f <- function(m) {
blnNA <- is.na(m)
m[blnNA] <- 0
i <- max.col(m, "first")
x <- m[matrix(c(1:nrow(m), i), ncol = 2)]
m <- matrix(sequence(rep(ncol(m), nrow(m)), x*(1 - i), x), nrow(m), ncol(m), 1)
m[blnNA] <- NA
m
}
f(m)
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#>  [1,]   -1    0   NA   NA   NA   NA   NA
#>  [2,]    0    0   NA   NA   NA   NA   NA
#>  [3,]   NA   NA    0    0    0   NA   NA
#>  [4,]   NA   NA    0    1    2    3    4
#>  [5,]   NA   NA    0    1    2    3    4
#>  [6,]   NA   NA    0    0    0    0    0
#>  [7,]    0   NA   NA   NA   NA   NA   NA
#>  [8,]    0    0   NA   NA   NA   NA   NA
#>  [9,]   NA   NA   -1    0    1    2    3
#> [10,]   NA   NA    0    1    2    3    4
#> [11,]   NA   NA    0   NA   NA   NA   NA
#> [12,]    0    1   NA   NA   NA   NA   NA
#> [13,]   NA   NA    0    1    2    3    4
#> [14,]   NA   NA    0    0    0    0    0
#> [15,]   NA   NA   -1    0   NA   NA   NA
#> [16,]   NA   NA   -1    0   NA   NA    3
#> [17,]    0   NA   NA   NA   NA   NA   NA
#> [18,]    0   NA   NA   NA   NA   NA   NA
#> [19,]   NA   NA   -4   -3   -2   -1    0
#> [20,]   NA   NA    0    1    2    3    4
#> [21,]   NA   NA    0    1   NA   NA   NA
#> [22,]   NA   NA   -1    0   NA   NA   NA
#> [23,]   NA   NA   -3   -2   -1    0   NA
#> [24,]   NA   NA    0    1    2    3   NA
#> [25,]   NA   NA    0    0    0    0    0
#> [26,]   NA   NA    0   NA   NA   NA   NA
#> [27,]   NA   NA    0   NA   NA   NA   NA
#> [28,]   NA   NA    0   NA   NA   NA   NA
#> [29,]    0    1    2   NA   NA   NA   NA
#> [30,]   NA    0    1   NA   NA   NA   NA

编辑:按照Robert Hacken的建议,清楚地表示没有1的行:

f <- function(m) {
idxNA <- which(is.na(m))
m[idxNA] <- 0
i <- max.col(m, "first")
x <- m[matrix(c(1:nrow(m), i), ncol = 2)]
m <- matrix(sequence(rep(ncol(m), nrow(m)), x*(1 - i) - 1, x), nrow(m), ncol(m), 1)/x + 1
m[idxNA] <- NA
m
}
f(m)
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#>  [1,]   -1    0   NA   NA   NA   NA   NA
#>  [2,] -Inf -Inf   NA   NA   NA   NA   NA
#>  [3,]   NA   NA -Inf -Inf -Inf   NA   NA
#>  [4,]   NA   NA    0    1    2    3    4
#>  [5,]   NA   NA    0    1    2    3    4
#>  [6,]   NA   NA -Inf -Inf -Inf -Inf -Inf
#>  [7,] -Inf   NA   NA   NA   NA   NA   NA
#>  [8,] -Inf -Inf   NA   NA   NA   NA   NA
#>  [9,]   NA   NA   -1    0    1    2    3
#> [10,]   NA   NA    0    1    2    3    4
#> [11,]   NA   NA    0   NA   NA   NA   NA
#> [12,]    0    1   NA   NA   NA   NA   NA
#> [13,]   NA   NA    0    1    2    3    4
#> [14,]   NA   NA -Inf -Inf -Inf -Inf -Inf
#> [15,]   NA   NA   -1    0   NA   NA   NA
#> [16,]   NA   NA   -1    0   NA   NA    3
#> [17,] -Inf   NA   NA   NA   NA   NA   NA
#> [18,]    0   NA   NA   NA   NA   NA   NA
#> [19,]   NA   NA   -4   -3   -2   -1    0
#> [20,]   NA   NA    0    1    2    3    4
#> [21,]   NA   NA    0    1   NA   NA   NA
#> [22,]   NA   NA   -1    0   NA   NA   NA
#> [23,]   NA   NA   -3   -2   -1    0   NA
#> [24,]   NA   NA    0    1    2    3   NA
#> [25,]   NA   NA -Inf -Inf -Inf -Inf -Inf
#> [26,]   NA   NA -Inf   NA   NA   NA   NA
#> [27,]   NA   NA -Inf   NA   NA   NA   NA
#> [28,]   NA   NA -Inf   NA   NA   NA   NA
#> [29,]    0    1    2   NA   NA   NA   NA
#> [30,]   NA    0    1   NA   NA   NA   NA

你可以这样做:

mat[] <- t(apply(mat, 1, (x) (seq_along(x) - min(which(x == 1))) + x*0))
#mat[is.infinite(mat)] <- 0

输出
> mat
1    2    4    5    6    7    8
1    -1    0   NA   NA   NA   NA   NA
2  -Inf -Inf   NA   NA   NA   NA   NA
3    NA   NA -Inf -Inf -Inf   NA   NA
4    NA   NA    0    1    2    3    4
5    NA   NA    0    1    2    3    4
6    NA   NA -Inf -Inf -Inf -Inf -Inf
7  -Inf   NA   NA   NA   NA   NA   NA
8  -Inf -Inf   NA   NA   NA   NA   NA
9    NA   NA   -1    0    1    2    3
10   NA   NA    0    1    2    3    4
11   NA   NA    0   NA   NA   NA   NA
12    0    1   NA   NA   NA   NA   NA
13   NA   NA    0    1    2    3    4
14   NA   NA -Inf -Inf -Inf -Inf -Inf
15   NA   NA   -1    0   NA   NA   NA
16   NA   NA   -1    0   NA   NA    3
17 -Inf   NA   NA   NA   NA   NA   NA
18    0   NA   NA   NA   NA   NA   NA
19   NA   NA   -4   -3   -2   -1    0
20   NA   NA    0    1    2    3    4
21   NA   NA    0    1   NA   NA   NA
22   NA   NA   -1    0   NA   NA   NA
23   NA   NA   -3   -2   -1    0   NA
24   NA   NA    0    1    2    3   NA
25   NA   NA -Inf -Inf -Inf -Inf -Inf
26   NA   NA -Inf   NA   NA   NA   NA
27   NA   NA -Inf   NA   NA   NA   NA
28   NA   NA -Inf   NA   NA   NA   NA
29    0    1    2   NA   NA   NA   NA
30   NA    0    1   NA   NA   NA   NA

这可能是一个解决方案。但是,您必须指定当所有条目为0或NA时发生的情况。因此,您必须修改nomatch参数以适应您的规范。

m <- structure(c(0, 0, NA, NA, NA, NA, 0, 0, NA, NA, NA, 1, NA, NA, 
NA, NA, 0, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 
1, 0, NA, NA, NA, NA, NA, 0, NA, NA, NA, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, 0, 
1, 1, 0, NA, NA, 0, 1, 1, NA, 1, 0, 0, 0, NA, NA, 0, 1, 1, 0, 
0, 1, 0, 0, 0, 0, 1, 1, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, 
NA, 1, 0, 1, 1, NA, NA, 0, 1, 1, 1, 0, 1, 0, NA, NA, NA, NA, 
NA, NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, 
NA, 0, 1, NA, NA, 0, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 
1, 0, NA, NA, 1, 1, NA, NA, 1, 0, NA, NA, NA, NA, 0, 1, NA, NA, 
1, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, 0, NA, NA, 1, 
1, NA, NA, 1, 0, NA, 1, NA, NA, 1, 1, NA, NA, NA, NA, 0, NA, 
NA, NA, NA, NA), dim = c(30L, 7L), dimnames = list(c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", 
"26", "27", "28", "29", "30"), c("1", "2", "4", "5", "6", "7", 
"8")))
m
#>     1  2  4  5  6  7  8
#> 1   0  1 NA NA NA NA NA
#> 2   0  0 NA NA NA NA NA
#> 3  NA NA  0  0  0 NA NA
#> 4  NA NA  1  1  1  1  1
#> 5  NA NA  1  1  1  1  1
#> 6  NA NA  0  0  0  0  0
#> 7   0 NA NA NA NA NA NA
#> 8   0  0 NA NA NA NA NA
#> 9  NA NA  0  1  1  1  1
#> 10 NA NA  1  1  1  1  1
#> 11 NA NA  1 NA NA NA NA
#> 12  1  1 NA NA NA NA NA
#> 13 NA NA  1  1  1  1  1
#> 14 NA NA  0  0  0  0  0
#> 15 NA NA  0  1 NA NA NA
#> 16 NA NA  0  1 NA NA  1
#> 17  0 NA NA NA NA NA NA
#> 18  1 NA NA NA NA NA NA
#> 19 NA NA  0  0  0  0  1
#> 20 NA NA  1  1  1  1  1
#> 21 NA NA  1  1 NA NA NA
#> 22 NA NA  0  1 NA NA NA
#> 23 NA NA  0  0  0  1 NA
#> 24 NA NA  1  1  1  1 NA
#> 25 NA NA  0  0  0  0  0
#> 26 NA NA  0 NA NA NA NA
#> 27 NA NA  0 NA NA NA NA
#> 28 NA NA  0 NA NA NA NA
#> 29  1  1  1 NA NA NA NA
#> 30 NA  1  1 NA NA NA NA
t(apply(m, 1, function(x) ifelse(is.na(x), NA, seq_along(x) - match(1, x, nomatch = 0))))
#>     1  2  4  5  6  7  8
#> 1  -1  0 NA NA NA NA NA
#> 2   1  2 NA NA NA NA NA
#> 3  NA NA  3  4  5 NA NA
#> 4  NA NA  0  1  2  3  4
#> 5  NA NA  0  1  2  3  4
#> 6  NA NA  3  4  5  6  7
#> 7   1 NA NA NA NA NA NA
#> 8   1  2 NA NA NA NA NA
#> 9  NA NA -1  0  1  2  3
#> 10 NA NA  0  1  2  3  4
#> 11 NA NA  0 NA NA NA NA
#> 12  0  1 NA NA NA NA NA
#> 13 NA NA  0  1  2  3  4
#> 14 NA NA  3  4  5  6  7
#> 15 NA NA -1  0 NA NA NA
#> 16 NA NA -1  0 NA NA  3
#> 17  1 NA NA NA NA NA NA
#> 18  0 NA NA NA NA NA NA
#> 19 NA NA -4 -3 -2 -1  0
#> 20 NA NA  0  1  2  3  4
#> 21 NA NA  0  1 NA NA NA
#> 22 NA NA -1  0 NA NA NA
#> 23 NA NA -3 -2 -1  0 NA
#> 24 NA NA  0  1  2  3 NA
#> 25 NA NA  3  4  5  6  7
#> 26 NA NA  3 NA NA NA NA
#> 27 NA NA  3 NA NA NA NA
#> 28 NA NA  3 NA NA NA NA
#> 29  0  1  2 NA NA NA NA
#> 30 NA  0  1 NA NA NA NA

相关内容

  • 没有找到相关文章

最新更新