Dalam R dengan sebuah matriks:
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
Saya ingin mengekstrak submatrix yang barisnya memiliki kolom tiga = 11. Yaitu:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Saya ingin melakukan ini tanpa perulangan. Saya baru mengenal R jadi ini mungkin sangat jelas tetapi dokumentasi seringkali agak singkat.
[ ]
jawaban dan Anda akan melihat ini lebih jelas.Jawaban:
Ini lebih mudah dilakukan jika Anda mengonversi matriks ke bingkai data menggunakan as.data.frame (). Jika demikian, jawaban sebelumnya (menggunakan subset atau m $ tiga) akan berfungsi, jika tidak maka tidak akan.
Untuk melakukan operasi pada sebuah matriks , Anda dapat mendefinisikan kolom dengan nama:
Atau dengan nomor:
Perhatikan bahwa jika hanya satu baris yang cocok, hasilnya adalah vektor integer, bukan matriks.
sumber
m[m[,3] == 11,,drop=FALSE]
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, di sini saya ingin menghapus orang-orang baris dari df saya di mana berbagai kolom (ARID3A: YY1) berisi nilai U .Perintah berikut akan memilih baris pertama dari matriks di atas.
Dan ini akan memilih tiga yang terakhir.
Hasilnya akan menjadi matriks dalam kedua kasus. Jika Anda ingin menggunakan nama kolom untuk memilih kolom maka Anda sebaiknya mengonversinya menjadi dataframe
Maka Anda dapat memilih dengan
Atau, Anda bisa menggunakan perintah subset.
sumber
Saya akan memilih pendekatan sederhana menggunakan paket dplyr.
Jika bingkai data adalah data.
sumber
Subset adalah fungsi yang sangat lambat, dan saya pribadi merasa itu tidak berguna.
Saya menganggap Anda memiliki data.frame, array, matriks disebut
Mat
denganA
,B
,C
sebagai nama kolom; maka yang perlu Anda lakukan adalah:Dalam kasus satu kondisi pada satu kolom, katakanlah kolom A
Dalam kasus beberapa kondisi pada kolom yang berbeda, Anda bisa membuat variabel dummy. Misalkan kondisi
A = 10
,B = 5
danC > 2
, maka kita harus:Dengan menguji keunggulan kecepatan
system.time
,which
metode ini 10x lebih cepat darisubset
metode.sumber
Jika matriks Anda dipanggil
m
, cukup gunakan:sumber
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, di sini saya ingin menghapus baris-baris itu dari df saya di mana rentang kolom (ARID3A: YY1) berisi nilaiU
Jika dataset disebut data, maka semua baris yang memenuhi suatu kondisi di mana nilai kolom 'pm2.5'> 300 dapat diterima oleh -
data [data ['pm2.5']> 300,]
sumber