簡體   English   中英

如何在 R 中編寫 function 以接受 dplyr 等列名?

[英]How can I write a function in R which accepts column names like dplyr?

我正在編寫一個 package ,其中有幾個函數接受 dataframe object 以及數據幀的列名 297DBC11FBZABDEDA8 。

這是一個簡化的示例:

func = function(df,vars){
    head(df[,vars])
}

#column args as strings
func(mtcars,c("mpg","cyl"))

我不希望將列名作為字符串提供,而是希望 function 接受(並建議/自動完成)像 dplyr 函數中的列名。

#dplyr-style args
func(mtcars, mpg, cyl)

#which doesnt work because mpg and cyl don't exist as objects

我考慮使用...作為 function arguments 但這仍然涉及使用字符串。

任何幫助,將不勝感激。

一個可能的解決方案,使用dplyr

library(dplyr)

func = function(df,...){
  df %>% 
    select(...) %>% 
    head
}


func(mtcars, mpg, cyl)
#>                    mpg cyl
#> Mazda RX4         21.0   6
#> Mazda RX4 Wag     21.0   6
#> Datsun 710        22.8   4
#> Hornet 4 Drive    21.4   6
#> Hornet Sportabout 18.7   8
#> Valiant           18.1   6

func(mtcars, mpg)

#>                    mpg
#> Mazda RX4         21.0
#> Mazda RX4 Wag     21.0
#> Datsun 710        22.8
#> Hornet 4 Drive    21.4
#> Hornet Sportabout 18.7
#> Valiant           18.1

或者在base R中:

func = function(df,...){
  head(df[, sapply(substitute(...()), deparse)])
}

func(mtcars, mpg, cyl)
#>                    mpg cyl
#> Mazda RX4         21.0   6
#> Mazda RX4 Wag     21.0   6
#> Datsun 710        22.8   4
#> Hornet 4 Drive    21.4   6
#> Hornet Sportabout 18.7   8
#> Valiant           18.1   6

func(mtcars, mpg)

#> [1] 21.0 21.0 22.8 21.4 18.7 18.1

您可以使用

subset(df, select = item)

您應該查看Hadley Wickham 的 Advanced R,這非常有趣,如果有點,那么,高級。 尤其是:

20.4 數據掩碼

在本節中,您將了解數據掩碼,這是一個數據框,評估代碼將首先在其中查找變量定義。 數據掩碼是為 with()、subset() 和 transform() 等基本函數提供支持的關鍵思想,並在整個 tidyverse 中用於 dplyr 和 ggplot2 等包中。

暫無
暫無

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

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