Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在dplyr::filter中将字符串作为变量名传递_R_Dplyr - Fatal编程技术网

在dplyr::filter中将字符串作为变量名传递

在dplyr::filter中将字符串作为变量名传递,r,dplyr,R,Dplyr,我用mtcars数据集来说明我的问题 例如,我想将数据子集为4缸汽车。我可以执行以下操作: mtcars %>% filter(cyl == 4) 在我的工作中,我需要传递一个字符串变量作为我的列名。例如: var <- 'cyl' mtcars %>% filter(var == 4) 在这两种情况下,我都得到了空数据帧 或UQ计算变量,因此mtcars%>%filter(!!var==4)与mtcars%>%filter('cyl'==4)相同,其中条件总是计算为fal

我用mtcars数据集来说明我的问题

例如,我想将数据子集为4缸汽车。我可以执行以下操作:

mtcars %>% filter(cyl == 4)
在我的工作中,我需要传递一个字符串变量作为我的列名。例如:

var <- 'cyl'
mtcars %>% filter(var == 4)

在这两种情况下,我都得到了空数据帧

UQ
计算变量,因此
mtcars%>%filter(!!var==4)
mtcars%>%filter('cyl'==4)
相同,其中条件总是计算为false;您可以通过打印
!!过滤函数中的var

mtcars %>% filter({ print(!!var); (!!var) == 4 })
# [1] "cyl"
#  [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
# <0 rows> (or 0-length row.names)
或者使用baseR中的
as.symbol/as.name

mtcars %>% filter((!!as.symbol(var)) == 4)

mtcars %>% filter((!!as.name(var)) == 4)

UQ
计算变量,因此
mtcars%>%filter(!!var==4)
mtcars%>%filter('cyl'==4)
相同,其中条件总是计算为false;您可以通过打印
!!过滤函数中的var

mtcars %>% filter({ print(!!var); (!!var) == 4 })
# [1] "cyl"
#  [1] mpg  cyl  disp hp   drat wt   qsec vs   am   gear carb
# <0 rows> (or 0-length row.names)
或者使用baseR中的
as.symbol/as.name

mtcars %>% filter((!!as.symbol(var)) == 4)

mtcars %>% filter((!!as.name(var)) == 4)
您可以使用eval(parse(text=将字符串作为变量进行求值:

mtcars %>% filter(eval(parse(text='cyl')) == 4)

您可以使用eval(parse)(text=将字符串作为变量进行求值:

mtcars %>% filter(eval(parse(text='cyl')) == 4)

我认为@snoram的回答很优雅,完全依赖于
dplyr

var <- c('cyl')
mtcars %>% filter(get(var) == 4)
var%过滤器(获取(var)==4)
您还可以将其用于列表。举个简单的例子,您可以将每个筛选列的计数作为新的数据集

#adding car name
mtcars <- rownames_to_column(mtcars, "car_name")

#name your vectors
vector <- c("vs","am","carb")

df2 <- data.frame()
for (variable in vector) {
  df1 <- mtcars %>% filter(get(variable) == 1) %>% summarise(variable = n_distinct(car_name)) %>% data.frame()

  df2<- rbind(df2,df1)
}
#添加汽车名称

mtcars我认为@snoram的答案很优雅,完全依赖于
dplyr

var <- c('cyl')
mtcars %>% filter(get(var) == 4)
var%过滤器(获取(var)==4)
您还可以将其用于列表。举个简单的例子,您可以将每个筛选列的计数作为新的数据集

#adding car name
mtcars <- rownames_to_column(mtcars, "car_name")

#name your vectors
vector <- c("vs","am","carb")

df2 <- data.frame()
for (variable in vector) {
  df1 <- mtcars %>% filter(get(variable) == 1) %>% summarise(variable = n_distinct(car_name)) %>% data.frame()

  df2<- rbind(df2,df1)
}
#添加汽车名称

mtcars现在建议使用
.data
代词:

library(dplyr)

mtcars %>% filter(.data[[var]] == 4)

#                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

现在建议使用
.data
代词:

library(dplyr)

mtcars %>% filter(.data[[var]] == 4)

#                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

我怎么能做同样的事情,但对于字符串列表(最终对应于列名列表)@Psidom,使用您给出的示例,这些方法在我的安装(使用R3.5)中都不起作用。“sym”方法返回与mtcars大小相同的矩阵,但都是零。“as.symbol”和“as.name”方法都返回“无效参数类型”错误。知道发生了什么吗?如果您需要另一个包在dplyr中执行此操作,这太疯狂了,
mtcars%>%filter(get(var)==4)
?不确定使用
get()
是否有任何问题,但dplyr已经导入了rlang,因此它已经安装好了。get()是simplerhow我可以做同样的事情,但是对于字符串列表(最终对应于列名列表)@Psidom,使用您给出的示例,这些方法在我的安装(使用R3.5)中都不起作用。“sym”方法返回与mtcars大小相同的矩阵,但都是零。“as.symbol”和“as.name”“方法都返回“无效参数类型”错误。知道发生了什么吗?如果您需要另一个包在dplyr中执行此操作,这太疯狂了,
mtcars%>%filter(get(var)==4)
?不确定使用
get()
是否有任何问题,但dplyr已经导入了rlang,因此它已经安装好了。get()simplerI looove这个解决方案!我不明白为什么将变量名指定为变量会如此困难(函数中包含dyplr)。这是一个令人惊讶且易于理解的解决方案。我looove这个解决方案!我不明白为什么将变量名指定为变量会如此困难(函数中包含dyplr)。这是一个令人惊讶且简单易懂的解决方案。这能回答您的问题吗?这能回答您的问题吗?如果您想使用
mutate
作为dplyr动词,这看起来不起作用。这取决于您正在尝试做什么。如果您想使用
mutate
作为dplyr动词,这看起来不起作用。这取决于什么你正在努力去做。