簡體   English   中英

如何獲取矩陣中與向量值匹配的元素的索引

[英]How to get the index of elements in a matrix that match values of a vector

我想找到矩陣m中與向量v1v2匹配的元素的索引。 所以從類似於res東西我想得到元素2 ,從res1得到 8。謝謝!

flink = c("logit", "probit", "GEVmodNS", "GEVmod")
fcor = c("tanimoto", "exponential", "gaussian", "independent")
v1 = c('logit', 'exponential')
v2 = c('probit', 'independent')
m = expand.grid(fcor,flink)
res = m %in%v1
res1 = m %in%v2
which(apply(m, 1, function(x) all(x %in% v1)))
[1] 2

which(apply(m, 1, function(x) all(x %in% v2)))
[1] 8

如果順序很重要以至於您希望一行與v1v2的順序完全匹配,則使用==而不是%in%

更新:感謝@Greg 指針! 我們仍然可以將which==一起使用which但必須聲明向量和矩陣元素的位置:

> which(m[,1] == v1[2] & m[,2] == v1[1])
[1] 2
> which(m[,1] == v2[2] & m[,2] == v2[1])
[1] 8

第一個答案(就 OP 的問題而言,這是不正確的)

which(v1 == m)
which(v2 == m)
> which(v1 == m)
[1]  2  6 10 14 17 19
> which(v2 == m)
[1]  4  8 12 16 21 23

嘗試這個

> which(!lengths(Map(setdiff, list(v1), asplit(m, 1))))
[1] 2

> which(!lengths(Map(setdiff, list(v2), asplit(m, 1))))
[1] 8

假設您希望在匹配時順序很重要

          Var2           Var1
   1     logit       tanimoto
   2     logit    exponential
#         ...           ...

# Should match row 2.
v1 <- c('logit', 'exponential')

# Should NOT match row 2.
v3 <- c('exponential', 'logit')

這是原生管道|>的優雅替代方案,適用於任意數量的字段

(v1 == t(m)) |> apply(2, all) |> which()
# [1] 2

(v2 == t(m)) |> apply(2, all) |> which()
# [1] 8

只要確保以正確的順序命名列

m <- expand.grid(flink, fcor)

使它們對應於v1等中的值。

這是基 R 中的一個函數來執行此操作 -

match_a_row <- function(data, var1, var2) {
  which(data[[1]] == var1 & data[[2]] == var2)
}

match_a_row(m, 'exponential', 'logit')
#[1] 2
match_a_row(m, 'independent', 'probit')
#[1] 8

暫無
暫無

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

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