Dplyr'e katılırken x ve y sütunlarının adları nasıl belirtilir?


91

Dplyr kullanarak birleştirmek istediğim iki veri çerçevem ​​var. Biri, ilk isimleri içeren bir veri çerçevesidir.

test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
                        stringsAsFactors = FALSE)

Diğer veri çerçevesi, cinsiyeti tanımlayan Kantrowitz isimleri külliyatının temizlenmiş bir versiyonunu içerir. İşte minimal bir örnek:

kantrowitz <- structure(list(name = c("john", "bill", "madison", "abby", "thomas"), gender = c("M", "either", "M", "either", "M")), .Names = c("name", "gender"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", "data.frame"))

Esasen test_datatabloyu kullanarak tablodan ismin cinsiyetine bakmak istiyorum kantrowitz. Ben bir işlevi içine bu soyut gidiyorum Çünkü encode_gender, ben kullanılacak gidiyor veri kümesindeki sütunun adını bilmez ve bunu olacağını garanti edemez böylece nameolduğu gibi kantrowitz$name.

Temelde RI birleştirme işlemini şu şekilde gerçekleştirir:

merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)

Bu, doğru çıktıyı döndürür:

  first_name gender
1       abby either
2       bill either
3       john      M
4    madison      M
5        zzz   <NA>

Ama bunu dplyr'de yapmak istiyorum çünkü diğer tüm veri işlemelerim için bu paketi kullanıyorum. byÇeşitli *_joinişlevler için dplyr seçeneği yalnızca bir sütun adı belirlememe izin veriyor, ancak iki tane belirtmem gerekiyor. Bunun gibi bir şey arıyorum:

library(dplyr)
# either
left_join(test_data, kantrowitz, by.x = "first_name", by.y = "name")
# or
left_join(test_data, kantrowitz, by = c("first_name", "name"))

Dplyr kullanarak bu tür bir birleştirme gerçekleştirmenin yolu nedir?

(Kantrowitz külliyatının cinsiyeti belirlemenin kötü bir yolu olduğunu boşverin. Daha iyi bir uygulama üzerinde çalışıyorum, ancak önce bunun çalışmasını istiyorum.)


3
Şu anda yapamazsınız, ancak yapılacaklar listesinde: github.com/hadley/dplyr/issues/177
hadley

Yanıtlar:


153

Bu özellik dplyr v0.3'te eklenmiştir. Artık, her veri çerçevesinde hangi sütunların birleştirileceğini belirtmek için içindeki bybağımsız değişkene left_join(ve diğer birleştirme işlevlerine) adlandırılmış bir karakter vektörü iletebilirsiniz . Orijinal soruda verilen örnekle, kod şöyle olacaktır:

left_join(test_data, kantrowitz, by = c("first_name" = "name"))

13
düzenlemek yanı genel durumda bulunan bu eserler: left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third"))?
davidski

by =İsteğe bağlıdır. Yapabilirsinleft_join(test_data, kantrowitz, c("first_name" = "name"))
Pranay Aryal

11
Bu, herhangi bir fonksiyon argümanı için geçerlidir. Ancak bu durumda genellikle konum eşleştirme yerine adlandırılmış bağımsız değişkenleri kullanarak açık olmayı daha iyi buluyorum.
Lincoln Mullen

5

Bu, gerçek bir çözümden çok geçici bir çözümdür. test_dataBaşka bir sütun adıyla yeni bir nesne oluşturabilirsiniz :

left_join("names<-"(test_data, "name"), kantrowitz, by = "name")

     name gender
1    john      M
2    bill either
3 madison      M
4    abby either
5     zzz   <NA>

Yeniden adlandırmanın bir kopyayı tetiklediğini düşünüyorum, bu bir şekilde dplyr'den kaçınır ve bunun yerine size yaptırır.
joran

2
0.1.2'de en azından yapabileceksiniz select(test_data, first_name = name)ve bu sadece yüzeysel bir kopya oluşturacaktır.
hadley

1
Kullan data.table::setnames?
Hugh

2
çözüm seçimi (test_data, first_name = name) Haziran 2014 itibarıyla çalışmıyor
userJT
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.