Saya ingin menggunakan dplyr::mutate()
untuk membuat beberapa kolom baru dalam bingkai data. Nama kolom dan isinya harus dihasilkan secara dinamis.
Contoh data dari iris:
library(dplyr)
iris <- tbl_df(iris)
Saya telah membuat fungsi untuk mengubah kolom baru saya dari Petal.Width
variabel:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df <- mutate(df, varname = Petal.Width * n) ## problem arises here
df
}
Sekarang saya membuat lingkaran untuk membuat kolom saya:
for(i in 2:5) {
iris <- multipetal(df=iris, n=i)
}
Namun, karena mutate berpikir varname adalah nama variabel literal, loop hanya membuat satu variabel baru (disebut varname) alih-alih empat (disebut petal.2 - petal.5).
Bagaimana saya bisa mutate()
menggunakan nama dinamis saya sebagai nama variabel?
dplyr
miliki sketsa lengkap tentang evaluasi non-standarmutate_
, dan itu benar-benar tidak jelas dari fungsi lain cara menggunakannya.Jawaban:
Karena Anda secara dinamis membangun nama variabel sebagai nilai karakter, lebih masuk akal untuk melakukan penugasan menggunakan pengindeksan data.frame standar yang memungkinkan nilai karakter untuk nama kolom. Sebagai contoh:
The
mutate
Fungsi membuatnya sangat mudah untuk nama kolom baru melalui parameter bernama. Tapi itu mengasumsikan Anda tahu nama saat mengetik perintah. Jika Anda ingin menentukan nama kolom secara dinamis, maka Anda juga harus membangun argumen yang dinamai.versi dplyr> = 0,7
Versi terbaru
dplyr
(0.7) melakukan ini menggunakan dengan menggunakan:=
untuk secara dinamis menetapkan nama parameter. Anda dapat menulis fungsi Anda sebagai:Untuk informasi lebih lanjut, lihat formulir dokumentasi yang tersedia
vignette("programming", "dplyr")
.dplyr (> = 0,3 & <0,7)
Versi sedikit lebih awal
dplyr
(> = 0,3 <0,7), mendorong penggunaan alternatif "evaluasi standar" untuk banyak fungsi. Lihat sketsa evaluasi Non-standar untuk informasi lebih lanjut (vignette("nse")
).Jadi di sini, jawabannya adalah menggunakan
mutate_()
daripadamutate()
melakukan:dplyr <0,3
Perhatikan ini juga dimungkinkan dalam versi lama
dplyr
yang ada saat pertanyaan awalnya diajukan. Ini membutuhkan penggunaanquote
dansetName
:sumber
do.call()
mungkin tidak melakukan apa yang Anda pikirkan: rpubs.com/hadley/do-call2 . Lihat juga sketsa nse dalam versi dev dplyr.do.call
atas untuk digunakando.call("mutate")
dan mengutipdf
dalam daftar. Apakah itu yang Anda sarankan? Dan ketikalazyeval
versidplyr
adalah versi yang dirilis, makamutate_(df, .dots= setNames(list(~Petal.Width * n), varname))
apakah akan menjadi solusi yang lebih baik?mutate(df, !!newVar := (!!var1 + !!var2) / 2)
tidak bekerja :(Dalam rilis baru
dplyr
(0.6.0
menunggu pada April 2017), kami juga dapat melakukan penugasan (:=
) dan meneruskan variabel sebagai nama kolom dengan tanda kutip (!!
) untuk tidak mengevaluasinyaMemeriksa output berdasarkan @ MrFlick yang
multipetal
diterapkan pada 'iris1'sumber
Setelah banyak trial and error, saya menemukan pola yang
UQ(rlang::sym("some string here")))
sangat berguna untuk bekerja dengan string dan kata kerja dplyr. Tampaknya bekerja dalam banyak situasi mengejutkan.Berikut ini contoh dengan
mutate
. Kami ingin membuat fungsi yang menambahkan bersama dua kolom, tempat Anda meneruskan fungsi kedua nama kolom sebagai string. Kita dapat menggunakan pola ini, bersama dengan operator penugasan:=
, untuk melakukan ini.Pola tersebut juga berfungsi dengan
dplyr
fungsi lain . Inilahfilter
:Atau
arrange
:Sebab
select
, Anda tidak perlu menggunakan polanya. Sebagai gantinya Anda dapat menggunakan!!
:sumber
myCol
menjadi url (misalnya), dan menyalin kolom lamamyColInitialValue
di akhir kerangka datadf
dengan nama baru. Tapiwhich(colnames(df)=='myCol')
kirim kembali col # darimyColInitialValue
. Saya belum menulis masalah karena saya belum menemukan reprex. Tujuan saya adalah untukescape
parameterDT::datatable()
. Saya menggunakanescape=FALSE
menunggu itu. Dengan konstanta tidak berfungsi juga, tetapi paket DT tampaknya juga mendapatkan kolom # yang buruk. :)escape
sebuahDT::datatable
varname = sym("Petal.Width"); ggplot(iris, aes(x=!!varname)) + geom_histogram()
Ini versi lain, dan ini bisa dibilang sedikit lebih sederhana.
sumber
Dengan
rlang 0.4.0
kami memiliki operator keriting-keriting ({{}}
) yang membuatnya sangat mudah.Kami juga dapat memberikan nama variabel yang dikutip / tidak dikutip untuk ditugaskan sebagai nama kolom.
Ini bekerja sama dengan
sumber
Saya juga menambahkan jawaban yang menambah ini sedikit karena saya datang ke entri ini ketika mencari jawaban, dan ini hampir apa yang saya butuhkan, tetapi saya membutuhkan sedikit lebih banyak, yang saya dapatkan melalui jawaban @MrFlik dan jawaban Sketsa R lazyeval.
Saya ingin membuat fungsi yang dapat mengambil dataframe dan vektor nama kolom (sebagai string) yang ingin saya konversi dari string ke objek Date. Saya tidak tahu bagaimana cara
as.Date()
mengambil argumen yang merupakan string dan mengubahnya menjadi kolom, jadi saya melakukannya seperti yang ditunjukkan di bawah ini.Di bawah ini adalah bagaimana saya melakukan ini melalui SE bermutasi (
mutate_()
) dan.dots
argumennya. Selamat datang kritik yang membuat ini lebih baik.sumber
Sementara saya menikmati menggunakan dplyr untuk penggunaan interaktif, saya merasa sangat sulit untuk melakukan ini menggunakan dplyr karena Anda harus melalui lingkaran untuk menggunakan lazyeval :: interp (), setNames, dll.
Ini adalah versi yang lebih sederhana menggunakan basis R, di mana tampaknya lebih intuitif, setidaknya bagi saya, untuk meletakkan loop di dalam fungsi, dan yang memperluas solusi @Fricks.
sumber
dplyr
banyak pengaturan non-interaktif, menggunakannya dengan input variabel di dalam fungsi menggunakan sintaks yang sangat kikuk.Anda dapat menikmati paket
friendlyeval
yang menyajikan API evaluasi sederhana dan dokumentasi untuk yang lebih baru / kasualdplyr
pengguna .Anda membuat string yang ingin Anda
mutate
perlakukan sebagai nama kolom. Jadi menggunakanfriendlyeval
Anda bisa menulis:Yang di bawah kap panggilan
rlang
fungsi yang memeriksavarname
sah sebagai nama kolom.friendlyeval
kode dapat dikonversikan menjadi kode evalusi rapi yang setara kapan saja dengan addt RStudio.sumber
Alternatif lain: gunakan
{}
tanda kutip di dalam untuk membuat nama dinamis dengan mudah. Ini mirip dengan solusi lain tetapi tidak persis sama, dan saya merasa lebih mudah.Saya pikir ini berasal dari
dplyr 1.0.0
tetapi tidak yakin (saya juga punyarlang 4.7.0
jika itu penting).sumber