簡體   English   中英

如何通過 function 中的列名來執行過濾、select 和 R 中的 function 中的排序操作

[英]How to pass column names in function to carry out filter, select and sort actions within a function in R

我正在嘗試執行過濾器 select 並通過定義 function 來安排對數據框的操作。

下面是我試圖通過 function 復制的代碼:

mtcars %>%  
  filter(disp > 150) %>%  
  select(disp, hp) %>%  
  arrange(hp)

我創建的 function 如下:

process_data <- function(df, col_1, col_2){
  df %>%  filter(col_1 > 150) %>%  
    select(col_1, col_2)
}

process_data(df = mpg, col_1 = "disp", col_2 = "hp")

但是,當我嘗試執行時,出現以下錯誤:

錯誤:無法對不存在的列進行子集化。 x 列disp不存在。

嘗試了多種傳遞列名的方法,但沒有用。

如果我們將字符串作為輸入傳遞,我們需要轉換為sym並計算 ( !! )

library(dplyr)
process_data <- function(df, col_1, col_2){
   col_1 <- rlang::ensym(col_1)
   col_2 <- rlang::ensym(col_2)
  df %>%  filter(!!col_1 > 150) %>%  
    select(!!col_1, !!col_2)
}

-測試

process_data(df = mtcars, col_1 = "disp", col_2 = "hp")
                     disp  hp
Mazda RX4           160.0 110
Mazda RX4 Wag       160.0 110
Hornet 4 Drive      258.0 110
Hornet Sportabout   360.0 175
Valiant             225.0 105
Duster 360          360.0 245
Merc 280            167.6 123
Merc 280C           167.6 123
Merc 450SE          275.8 180
Merc 450SL          275.8 180
Merc 450SLC         275.8 180
Cadillac Fleetwood  472.0 205
Lincoln Continental 460.0 215
Chrysler Imperial   440.0 230
Dodge Challenger    318.0 150
AMC Javelin         304.0 150
Camaro Z28          350.0 245
Pontiac Firebird    400.0 175
Ford Pantera L      351.0 264
Maserati Bora       301.0 335

使用any_of另一種解決方案:

process_data <- function(df, col_1, col_2){
    df %>% 
        filter(col_1 > 150) %>% 
        select(any_of(c(col_1, col_2)))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM