我有兩個向量
seqX <- c("seq1","seq2","seq3")
seqY <- c("seqA","seqB")
并希望創建一個seqX x seqY矩陣,其中每個單元格包含由用戶函式計算的值,該值依賴于特定單元格的每個seqX x seqY組合的值。例如像這樣的用戶函式
my.function.example <- function (seqX,seqY) {
return(paste(seqX,"-",seqY))
}
應該產生如下所示的結果:
[,1] [,2] [,3]
[1,] seq1-seqA seq2-seqA seq3-seqA
[2,] seq1-seqB seq2-seqB seq3-seqB
我迷失了tapply,sapply等,因此我尋求您的幫助。我的兩個問題是:
- 如何創建矩陣并應用依賴于兩個向量的函式?
- 如果 seqX <- seqY (這意味著所有組合將出現兩次,我將不得不冗余計算它們),我怎樣才能最有效地做到這一點
非常感謝您的幫助 - 提前感謝您!
親切的問候,馬丁
uj5u.com熱心網友回復:
你騙用outer.
t(outer(seqX, seqY, my.function.example))
# [,1] [,2] [,3]
#[1,] "seq1 - seqA" "seq2 - seqA" "seq3 - seqA"
#[2,] "seq1 - seqB" "seq2 - seqB" "seq3 - seqB"
t(outer(seqX, seqY, paste, sep="-"))
# [,1] [,2] [,3]
#[1,] "seq1-seqA" "seq2-seqA" "seq3-seqA"
#[2,] "seq1-seqB" "seq2-seqB" "seq3-seqB"
基準
bench::mark(check=FALSE,
GKi = t(outer(seqX, seqY, my.function.example)),
Shree = sapply(seqX, function(x) my.function.example(x, seqY)), #Adapted
Peter = with(expand.grid(a=seqX, b=seqY), matrix(my.function.example(a, b), length(seqY), byrow=TRUE)) #Adapted
)
結果
expression min median itr/s…1 mem_a…2 gc/se…3 n_itr n_gc total…? result
<bch:expr> <bch:tm> <bch:t> <dbl> <bch:b> <dbl> <int> <dbl> <bch:t> <list>
1 GKi 7.47μs 11.1μs 73248. 0B 51.3 9993 7 136ms <NULL>
2 Shree 22.09μs 30μs 28128. 4.95KB 62.0 9978 22 355ms <NULL>
3 Peter 46.1μs 76μs 11531. 0B 70.4 4750 29 412ms <NULL>
GKi 比 Shree 快 2.5 倍,比 Peter 快 6 倍。
uj5u.com熱心網友回復:
seqX <- c("seq1","seq2","seq3")
seqY <- c("seqA","seqB")
xy <- expand.grid(x = seqX, y = seqY)
matrix(paste(xy$x, xy$y, sep = "-"), nrow = 2, byrow = TRUE)
#> [,1] [,2] [,3]
#> [1,] "seq1-seqA" "seq2-seqA" "seq3-seqA"
#> [2,] "seq1-seqB" "seq2-seqB" "seq3-seqB"
seqY <- seqX
xy <- expand.grid(x = seqX, y = seqY)
mx <- matrix(paste(xy$x, xy$y, sep = "-"), nrow = 3, byrow = TRUE)
mx[upper.tri(mx)] <- NA
mx
#> [,1] [,2] [,3]
#> [1,] "seq1-seq1" NA NA
#> [2,] "seq1-seq2" "seq2-seq2" NA
#> [3,] "seq1-seq3" "seq2-seq3" "seq3-seq3"
使用reprex v2.0.2創建于 2022-10-16
uj5u.com熱心網友回復:
這是一種方法sapply-
sapply(seqX, function(x) paste(x, "-", seqY))
seq1 seq2 seq3
[1,] "seq1 - seqA" "seq2 - seqA" "seq3 - seqA"
[2,] "seq1 - seqB" "seq2 - seqB" "seq3 - seqB"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515274.html
標籤:r
上一篇:借助R中的幾列洗掉錯誤添加的行
下一篇:在R中透視選定的行
