Pertanyaan Menggunakan fungsi beberapa kolom dalam panggilan dplyr mutate_at


Saya ingin menggunakan dplyr mutate_at berfungsi untuk menerapkan fungsi ke beberapa kolom dalam suatu dataframe, di mana fungsi masukan kolom yang langsung diterapkan serta kolom lain dalam dataframe.

Sebagai contoh konkret, saya akan melihat untuk mem-mutasi kerangka data berikut

# Example input dataframe
df <- data_frame(x = c(TRUE, TRUE, FALSE),
                 y = c("Hello", "Hola", "Ciao"),
                 z = c("World", "ao", "HaOlam")
                 )

dengan mutate_at panggilan yang terlihat mirip dengan ini

df %>%
mutate_at(.vars = vars(y, z),
          .funs = ifelse(x, ., NA)
          )

untuk mengembalikan dataframe yang terlihat seperti ini

# Desired output dataframe
df2 <- data_frame(x = c(TRUE, TRUE, FALSE),
                  y_1 = c("Hello", "Hola", NA),
                  z_1 = c("World", "ao", NA) 
                  )

Yang diinginkan mutate_at panggilan akan mirip dengan panggilan berikut ke mutate:

df %>%
   mutate(y_1 = ifelse(x, y, NA),
          z_1 = ifelse(x, z, NA)
          )

Saya tahu bahwa ini dapat dilakukan dalam basis R dalam beberapa cara, tetapi saya secara khusus ingin mencapai tujuan ini menggunakan dplyr's mutate_at berfungsi demi keterbacaan, berinteraksi dengan database, dll.

Di bawah ini adalah beberapa pertanyaan serupa yang ditanyakan pada stackoverflow yang tidak menjawab pertanyaan yang saya ajukan di sini:

menambahkan beberapa kolom dalam panggilan mutasi dplyr

dplyr :: bermutasi untuk menambahkan beberapa nilai

Penggunaan fungsi kolom di dalam sum () menggunakan fungsi dplyr bermutasi ()


32
2017-08-29 15:32


asal


Jawaban:


Ini dijawab oleh @ eipi10 di komentar @ eipi10 pada pertanyaan, tapi saya menulis di sini untuk anak cucu.

Solusinya di sini adalah menggunakan:

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = funs(ifelse(x, ., NA)))

Penggunaan funs() di sini menunjukkan itu ifelse(x, ., NA) adalah fungsi anonim yang ditentukan dalam panggilan ke mutate_at().

Ini berfungsi serupa dengan mendefinisikan fungsi di luar panggilan ke mutate_at(), seperti:

temp_fn <- function(input) ifelse(test = df[["x"]],
                                  yes = input,
                                  no = NA)

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = temp_fn)

38
2017-12-14 21:10



Untuk melengkapi tanggapan sebelumnya, jika Anda menginginkannya mutate_at() untuk menambahkan variabel baru (bukan mengganti), dengan nama seperti z_1 dan y_1 seperti pada pertanyaan awal, Anda hanya perlu menambahkan nama di dalam funs(newname= ...) panggilan:

df %>%
  mutate_at(.vars = vars(y, z),
            .funs = funs(`1`=ifelse(x, ., NA)))

Ini memberi:

# A tibble: 3 x 5
  x     y     z      y_1   z_1  
  <lgl> <chr> <chr>  <chr> <chr>
1 TRUE  Hello World  Hello World
2 TRUE  Hola  ao     Hola  ao   
3 FALSE Ciao  HaOlam NA    NA   

Untuk detail dan trik lebih lanjut, lihat: Buat variabel baru dengan mutate_at sekaligus menjaga yang asli


0
2017-07-11 00:29