2015-09-17 22 views
7

vectorized bu sorunun sorulmadığından çok şaşırdım, belki cevap nedenini açacaktır. Bir matrisin satırlarını bir vektör ile karşılaştırmak ve satırın her yerde vektörü döndürmek istiyorum. Aşağıdaki örneğe bakınız. Ben vectorized bir çözüm istiyorum, matrix çok yavaş döngü için çok büyük olduğu için herhangi bir işlev yok. Aynı zamanda birçok satır olduğunu varsayalım, bu yüzden vektörü tekrar etmekten kaçınmak istiyorum.Matris satırlarının R vektörüne eşit olup olmadığını kontrol edin,

set.seed(1) 

M = matrix(rpois(50,5),5,10) 

v = c(3 , 2 , 7 , 7 , 4 , 4 , 7 , 4 , 5, 6) 

M 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 4 8 3 5 9 4 5 6 7  7 
[2,] 4 9 3 6 3 1 5 7 6  1 
[3,] 5 6 6 11 6 4 5 2 7  5 
[4,] 8 6 4 4 3 8 3 6 5  6 
[5,] 3 2 7 7 4 4 7 4 5  6 

Çıktı olmalıdır

FALSE FALSE FALSE FALSE TRUE 

cevap

7

Bir olasılık

rowSums(M == v[col(M)]) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

Ya simlarly

rowSums(M == rep(v, each = nrow(M))) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

Ya

colSums(t(M) == v) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

v[col(M)]M bir vektör aynı boyutta oluşturur rep(v, each = nrow(M)) sadece daha kısa bir versiyonu (matris sadece bir vektördür, c(M) deneyin) ve daha sonra == kullanarak karşılık gelen bir karşı her eleman karşılaştırır. Neyse == bir array yöntem olan jenerik fonksiyon bize amacıyla üzerinde rowSums (veya colSums) çalışmasına olanak sağlayan (methods("Ops") ve is.array(M) bakınız) (biz DeMorgan kuralını kullanarak ncol(M)

+0

yüzden bu basit mantıksal görev için başka bir külfetli olacaktır yapmak, temsilcisi() kullanmaktan kaçınmak için umuyordum. – robertevansanders

+1

ColSums (t (M) == v) == ncol (M) 'daha iyi mi? Böyle değil "* basit mantıksal görev *" btw –

+0

Evet Thats harika. – robertevansanders

4

olarak maçların miktarda emin kılan ise Tüm Bazı değil), ardından Tüm Bazı eşit değildir değil = eşit, biz de

!colSums(t(M) != v) 
0

sorununuza için kullanımı kolay ve ideal row.match adında bir işlevi vardır prodlim paket var =. Önce kütüphaneyi kurun ve yükleyin: library(prodlim). Örneğimizde row.match, '5' değerini döndürecek çünkü M'daki 5. satır v'a eşittir. Sonra bunu mantıksal bir vektöre dönüştürebiliriz. M çok çok büyük bir matris olduğu için

m <- row.match(v, M) 
m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE TRUE 
İlgili konular