R - 将列名传递给要以非标准方式计算的函数

时间:2018-02-02 09:24:24

标签: r

我有一个数据框,我想将列名传递给R in然后根据该列进行过滤。 我试过阅读一些这方面的教程,似乎与R中的非标准评估有关。

我似乎无法绕过我读过的博文中的示例。 为简单起见,我已经采用了虹膜数据集,我想将一个列传递给一个函数,然后该函数将过滤列值大于一的数据集。

mydf <- iris

filter_measurements <- function(mydf, measurement){

  mydf <- filter(measurement >= 1)
  mydf

}

mydf %>% 
  filter_measurements(measurement = Petal.Width)

我是否必须在我的函数中添加一些内容,以便R知道我想要一个列而不是将它用作&#39; Petal.Width&#39;例如。

我见过Passing a variable name to a function in R我无法适应我的例子

谢谢大家的时间

2 个答案:

答案 0 :(得分:2)

一个很好的资源是Programming with dplyr

mydf <- iris

filter_measurements <- function(mydf, measurement){
  measurement <- enquo(measurement)

  mydf <- filter(mydf, (!!measurement) >= 1)
  mydf

}

mydf %>% 
  filter_measurements(measurement = Petal.Width)

你必须告诉测量作为裸变量名称的函数。首次使用enquo来评估measurement参数中给出的内容并将其存储为quosure。然后在测量前面!!filter函数知道它不必引用这个参数,因为它已经是一个结果。

<强>替代

您还可以将要过滤的列作为字符串传递,并使用filter_

filter_measurements <- function(mydf, measurement){

  mydf <- filter_(mydf, paste0(measurement, " >= 1"))
  mydf

}

mydf %>% 
  filter_measurements(measurement = "Petal.Width")

答案 1 :(得分:1)

您必须将列名称作为列的字符或整数索引传递。这一行

mydf <- filter(measurement >= 1)
在您的函数中

永远不会声明正在过滤的,并期望&#34;测量&#34;成为一个独立的对象,而不是数据框的一部分。 试试这个:

filter_measurements <- function(mydf, measurement)
{
  mydf <- filter(mydf, mydf[,measurement] >= 1)
  mydf
}

iris %>% filter_measurements("Petal.Width")

更复杂的函数调用也可以起作用:

iris %>% filter_measurements(which(names(.)=="Petal.Width"))