Bir koşula uyan bir matrisin satırlarını seçme


144

Bir matris ile R'de:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

Satırları üç sütun 11 = olan submatrix ayıklamak istiyorum.

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

Bunu döngü olmadan yapmak istiyorum. R için yeniyim, bu yüzden bu muhtemelen çok açık, ancak belgeler genellikle biraz gergin.


4
Her cevabın temel fikri, bazı indekslerle aynı uzunlukta bir mantıksal vektör / matris (DOĞRU ve YANLIŞ) varsa, yalnızca DOĞRU olan durumları seçeceğinizdir. [ ]Cevaplar arasında kodları çalıştırın ve bunu daha net göreceksiniz.
Sacha Epskamp

Yanıtlar:


160

Matrisinizi as.data.frame () kullanarak bir veri çerçevesine dönüştürürseniz bunu yapmak daha kolaydır. Bu durumda, önceki yanıtlar (alt kümeyi veya m $ üçünü kullanarak) çalışır, aksi takdirde çalışmazlar.

İşlemi bir matriste gerçekleştirmek için bir sütunu ada göre tanımlayabilirsiniz:

m[m[, "three"] == 11,]

Veya numaraya göre:

m[m[,3] == 11,]

Yalnızca bir satır eşleşirse, sonucun bir matris değil bir tamsayı vektörü olduğuna dikkat edin.


19
matrisi m[m[,3] == 11,,drop=FALSE]
korumanız

@neilfws Sütun aralığı için bazı değerler tanımlamak istersem çözüm ne olur? Örneğin df <- df[!which(df$ARID3A:df$YY1 == "U"),], burada bir dizi sütun (ARID3A: YY1) U değerini içeren benim df bu satırları kaldırmak istiyorum .
Newbie

Sütun adlarını hiç belirtmek istemiyorsanız ancak matristeki tüm sütunlar üzerinde çalışmak istiyorsanız bu nasıl çalışır?
user5359531

Hey @neilfws, buna nasıl && ifadesi ekleyebilirsiniz? Aynı anda iki sütun değeri almam gerekiyor mu?
XD

28
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

Aşağıdaki komut yukarıdaki matrisin ilk satırını seçecektir.

subset(m, m[,4] == 16)

Ve bu son üçünü seçecek.

subset(m, m[,4] > 17)

Sonuç her iki durumda da bir matris olacaktır. Sütunları seçmek için sütun adlarını kullanmak istiyorsanız, bunu en iyi şekilde bir veri çerçevesine dönüştürmek

mf <- data.frame(m)

Sonra ile seçim yapabilirsiniz

mf[ mf$a == 16, ]

Veya altküme komutunu kullanabilirsiniz.


21

Ben dplyr paketini kullanarak basit bir yaklaşım seçeceğim.

Veri çerçevesi veri ise.

library(dplyr)
result <- filter(data, three == 11)

11

Altküme çok yavaş bir işlevdir ve ben şahsen işe yaramaz buluyorum.

Sana bir data.frame, dizi, denilen matris olduğunu varsayalım Matile A, B, Csütun adları olarak; o zaman tek yapmanız gereken:

  • Bir sütunda bir koşul olması durumunda, A sütunu diyelim

    Mat[which(Mat[,'A'] == 10), ]

Farklı sütunda birden fazla koşul olması durumunda, sahte bir değişken oluşturabilirsiniz. Varsayalım durumlardır A = 10, B = 5ve C > 2o zaman var:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

Hız avantajını test ederek system.time, whichyöntem yöntemden 10 kat daha hızlıdır subset.


6

Matrisiniz çağrılırsa m, şunu kullanın:

R> m[m$three == 11, ]

@juba Bir dizi sütun için bazı değerler tanımlamak istersem çözüm ne olur? örneğin df <- df[!which(df$ARID3A:df$YY1 == "U"),], burada bir dizi sütun (ARID3A: YY1) değerini içeren df'imden bu satırları kaldırmak istiyorumU
Newbie

0

Veri kümesi veri olarak adlandırılırsa, 'pm2.5'> 300 sütununun değerinin alınabileceği bir koşulu karşılayan tüm satırlar -

veri [veri ['pm2.5']> 300,]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.