[英]Replacing off-diagonal elements with a fixed value
我有一個square matrix
,現在我想用一個固定值替換它所有的非對角線元素。 在 R 中的替換矩陣中的非對角線元素中討論了如何做到這一點的一些方法(希望這次問得更好)
例如,
m <- matrix(c(1,2,3,4,3,9,5,5,8),ncol=3)
m[upper.tri(m) | lower.tri(m)] <- 999
m
我想知道是否可以使用dplyr chain rule
來執行該步驟,例如
library(dplyr)
matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
### add this -> m[upper.tri(m) | lower.tri(m)] <- 999
任何指針都會非常有幫助
如果為了簡潔起見,您可以在管道中定義+應用匿名 function,如下所示:
matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
(\(.) {.[upper.tri(.) | lower.tri(.)] = 999; .})() %>%
## rest of pipeline
與ifelse
:
ifelse(row(m) == col(m), m, 999)
我們可能會使用
matrix(c(1,2,3,4,3,9,5,5,8),ncol=3) %>%
`[<-`(upper.tri(.) | lower.tri(.), 999)
-輸出
[,1] [,2] [,3]
[1,] 1 999 999
[2,] 999 3 999
[3,] 999 999 8
您可以使用 dplyr 中的 mutate function 來修改矩陣的元素。 以下是如何執行此操作的示例:
library(dplyr)
m <- matrix(c(1,2,3,4,3,9,5,5,8), ncol = 3)
m %>%
mutate(m = ifelse(upper.tri(m) | lower.tri(m), 999, m))
這將創建一個新矩陣,其維度與 m 相同,但非對角線元素替換為 999。
或者,您可以使用替換 function 直接修改原始矩陣 m:
m[upper.tri(m) | lower.tri(m)] <- 999
這將修改原始矩陣 m 並將非對角線元素替換為 999。
對於足夠大的m
和n
,使用等於r
的所有元素初始化m
× n
結果並僅替換對角元素會更有效:
m <- 1000L
n <- 1000L
r <- -1L
x <- diag(seq_len(min(m, n)), m, n)
microbenchmark::microbenchmark(
A = x |> (\(.) `diag<-`(array(r, dim(.), dimnames(.)), diag(., names = FALSE)))(),
B = x |> (\(.) `[<-`(., row(.) != col(.), r))(),
C = x |> (\(.) `[<-`(., upper.tri(.) | lower.tri(.), r))(),
times = 1000L)
Unit: microseconds
expr min lq mean median uq max neval
A 67.445 283.2075 520.3644 315.823 343.498 12723.82 1000
B 4475.232 5024.3450 5750.4401 5479.527 6081.837 16821.36 1000
C 8863.134 10034.4835 11035.8599 10535.052 11030.066 22211.34 1000
我們可以嘗試像下面這樣的管道
matrix(c(1, 2, 3, 4, 3, 9, 5, 5, 8), ncol = 3) %>%
{
999 * (!diag(nrow(.))) + diag(.)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.