簡體   English   中英

R:矩陣行運算

[英]R: Matrix row operations

我有一個矩陣A,它具有大量的行和列(在這樣的矩陣的一個示例下面),偶爾具有一整行的0值(如在此特定示例中的第4行)。

我想擁有一個檢查A的所有行並允許我對這些行的每個元素執行操作的函數。 有沒有簡單的方法可以做到這一點?

我也想知道矩陣是否是正確的數據結構。 感覺不太正確,也許數據幀對此更好?

A = matrix(
  c(0, 0, 1, 0, 0, 0, 0,
    1, 0, 1, 1, 0, 0, 0,
    0, 0, 0, 1, 1, 0, 0,
    0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 1, 1,
    0, 0, 0, 1, 1, 0, 1), nrow=7,ncol=7,byrow = TRUE)

對於該矩陣的每一行,我都想確定其中是否只有0。 如果是這樣,我想為每個元素設置值1 / N(其中N是ncol(A))。

須藤代碼:

如果(sum(A行)== 0),則row_of_A = 1 / ncol(A)

顯然,您需要這樣做:

A[rowSums(A != 0) == 0,] <- 1/ncol(A)
#          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
#[1,] 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000
#[2,] 1.0000000 0.0000000 1.0000000 1.0000000 0.0000000 0.0000000 0.0000000
#[3,] 0.0000000 0.0000000 0.0000000 1.0000000 1.0000000 0.0000000 0.0000000
#[4,] 0.1428571 0.1428571 0.1428571 0.1428571 0.1428571 0.1428571 0.1428571
#[5,] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 1.0000000 1.0000000
#[6,] 0.0000000 0.0000000 0.0000000 1.0000000 1.0000000 0.0000000 1.0000000
#[7,] 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000

說明:

  • A != 0檢查所有矩陣元素,並為非零元素返回邏輯為TRUE的邏輯矩陣。
  • 然后,我們對該邏輯矩陣的行求和,從而將FALSE / TRUE強制為0/1。
  • 我們檢查這些行和是否為0,並使用結果邏輯向量對行進行子集化。
  • 我們給這個子集分配1 / ncol。

基准表明apply較慢:

set.seed(42); A = matrix(sample(0:1, 5e4, TRUE), nrow=1e4)

library(microbenchmark)
microbenchmark(A[rowSums(A != 0) == 0,],
               A[!apply(A != 0, 1, any),],
               A[apply(A == 0, 1, all),])
#Unit: microseconds
#                        expr       min        lq       mean    median        uq       max neval cld
#   A[rowSums(A != 0) == 0, ]   572.202   593.298   620.7931   624.248   629.638   780.387   100  a 
# A[!apply(A != 0, 1, any), ] 14978.248 16124.652 17261.9530 17441.054 18129.975 22469.219   100   b
#  A[apply(A == 0, 1, all), ] 15182.122 16149.751 17616.8010 16561.657 17997.703 75148.079   100   b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM