Apakah ada cara yang lebih ringkas untuk mendapatkan satu kolom dplyr tbl sebagai vektor, dari tbl dengan database back-end (mis. Frame data / tabel tidak dapat diatur secara langsung)?
require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL
Itu akan terlalu mudah, jadi
collect(select(iris2, Species))[, 1]
# [1] "setosa" "setosa" "setosa" "setosa" etc.
Tapi sepertinya agak canggung.
r
dplyr
lazy-evaluation
collect
nacnudus
sumber
sumber
collect(iris2)$Species
kurang kikuk?Jawaban:
Dengan dplyr 0.7.0, Anda dapat menggunakan
pull
untuk mendapatkan vektor dari atbl
.sumber
Sesuai komentar dari @nacnudus, sepertinya ada
pull
fungsi yang diterapkan di dplyr 0.6:Untuk versi dplyr yang lebih lama, berikut adalah fungsi yang rapi untuk membuat mengeluarkan kolom sedikit lebih bagus (lebih mudah untuk mengetik, dan lebih mudah dibaca):
Ini memungkinkan Anda melakukan salah satu dari ini:
Yang menghasilkan...
Dan itu juga berfungsi dengan baik dengan bingkai data:
Cara yang bagus untuk melakukan ini di v0.2 dari
dplyr
:Atau jika Anda lebih suka:
Atau jika meja Anda tidak terlalu besar, cukup ...
sumber
pull <- function(x, y) { if (ncol(x) == 1) y <- 1 else y x[ , if (is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]] }
sehingga Anda dapat pergi denganiris2 %>% pull()
magrittr
operator eksposisi (%$%
) untuk menarik vektor dari bingkai data. yaituiris2 %>% select(Species) %>% collect() %$% Species
.pull()
akan diimplementasikan dalam versi dplyrAnda juga dapat menggunakan
unlist
yang menurut saya lebih mudah dibaca karena Anda tidak perlu mengulangi nama kolom atau menentukan indeks.sumber
unlist
tepat apa yang saya butuhkan. Terima kasih!unlist
juga dapat mengekstraksi nilai dari beberapa kolom (menggabungkan semua nilai ke dalam satu vektor), sementaradplyr::pull
terbatas pada satu kolom.Saya akan menggunakan
extract2
fungsi kenyamanan darimagrittr
:sumber
collect()
antaraselect
danextract2
?use_series(Species)
bahkan mungkin lebih mudah dibaca. Terima kasih telah memberi tahu saya tentang fungsi-fungsi ini, ada beberapa yang berguna dari mana datangnya.Saya mungkin akan menulis:
Karena dplyr dirancang untuk bekerja dengan tbl data, tidak ada cara yang lebih baik untuk mendapatkan satu kolom data.
sumber
group_by(column) %.% tally()
drop = TRUE
untukdplyr::select
menjadi luar biasa untuk banyak kasus penggunaan di mana kita benar-benar perlu mengekstraksi vektor.@ Luke1018 mengusulkan solusi ini di salah satu komentar:
Sebagai contoh:
Saya pikir itu pantas dijawab sendiri.
sumber
tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()
dan Anda juga bisa menambahkan yang lain%>% unname()
di akhir jika Anda mau, tetapi untuk tujuan saya, saya belum menemukan bahwa link rantai pipa terakhir diperlukan. Anda juga bisa menentukanuse.names = FALSE
dalamunlist()
perintah, yang melakukan hal yang sama seperti menambahkanunname()
ke rantai pipa.pull
perintah sekarang. Solusi saya ditulis sebelumdplyr
versi 0.6.%$%
berfungsi pada daftar mana pun, sedangkanpull()
tidakJika Anda terbiasa menggunakan tanda kurung siku untuk pengindeksan, opsi lain adalah dengan hanya membungkus pendekatan pengindeksan biasa dalam panggilan untuk melakukan deframe () , misalnya:
Itu dan tarik () keduanya cara yang cukup bagus untuk mendapatkan kolom tibble.
sumber