web-gelistirme-sc.com

Bir vektördeki değerleri temel alarak veri çerçevesinden satırları seçme

Buna benzer verilerim var:

dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))

fct değişkenindeki değerlere bağlı olarak bu veri çerçevesinden satır seçmek istiyorum. Örneğin, "a" veya "c" içeren satırları seçmek istersem bunu yapabilirim:

dt[dt$fct == 'a' | dt$fct == 'c', ]

hangi verim

1    a 2
3    c 3
5    c 5
7    a 7
9    c 9
10   a 1
12   c 2
14   c 4

beklenildiği gibi. Ancak gerçek verilerim daha karmaşık ve aslında bir vektördeki değerlere göre satır seçmek istiyorum

vc <- c('a', 'c')

Bu yüzden denedim

dt[dt$fct == vc, ]

ama elbette işe yaramıyor. Vektörde dolaşacak bir şeyi kodlayabileceğimi ve gereken satırları çıkarabileceğimi ve bunları yeni bir veri çerçevesine ekleyebileceğimi biliyorum, ama daha zarif bir yol olacağını umuyordum.

Öyleyse verilerimi vc vektörünün içeriğine göre nasıl filtreleyebilirim/alt-set edebilirim?

56
Joe King

?"%in%"'a bir göz atın.

dt[dt$fct %in% vc,]
   fct X
1    a 2
3    c 3
5    c 5
7    a 7
9    c 9
10   a 1
12   c 2
14   c 4

Ayrıca ?is.element kullanabilirsiniz:

dt[is.element(dt$fct, vc),]
102
johannes

Yukarıdakine benzer şekilde, filter _ dplyr kullanarak:

filter(df, fct %in% vc)
21
Andrew Haynes

Başka bir seçenek anahtarlı bir data.table kullanmaktır:

library(data.table)
setDT(dt, key = 'fct')[J(vc)]  # or: setDT(dt, key = 'fct')[.(vc)]

hangi sonuçlanır:

   fct X
1:   a 2
2:   a 7
3:   a 1
4:   c 3
5:   c 5
6:   c 9
7:   c 2
8:   c 4

Bu ne yapar:

  • setDT(dt, key = 'fct'), anahtar olarak ayarlanan fct sütunu ile data.frame öğesini data.table öğesine (bu, data.frame öğesinin geliştirilmiş bir biçimidir) dönüştürür.
  • Daha sonra sadece [J(vc)] ile vc vector ile alt kümeyi ayarlayabilirsiniz.

NOT: anahtar bir faktör/karakter değişkeni olduğunda, setDT(dt, key = 'fct')[vc] öğesini de kullanabilirsiniz, ancak vc sayısal bir vektör olduğunda çalışmaz. vc sayısal bir vektör olduğunda ve J() veya .() öğesine sarılı olmadığında, vc satır sırası olarak çalışır.

tuşları ve altküme kavramının daha ayrıntılı bir açıklaması skeçte ( Anahtarlarda ve hızlı ikili arama tabanlı alt küme .

Yorumlarda @ Frank tarafından önerilen bir alternatif:

setDT(dt)[J(vc), on=.(fct)]

vc, dt içinde bulunmayan değerleri içerdiğinde, nomatch = 0 eklemeniz gerekir:

setDT(dt, key = 'fct')[J(vc), nomatch = 0]

veya:

setDT(dt)[J(vc), on=.(fct), nomatch = 0]
8
Jaap