我有下一个矩阵:
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