我有一个数据框,我想将列名传递给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我无法适应我的例子
谢谢大家的时间
答案 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"))