按名称将变量传递给调用 dplyr 的函数?
Pass variables by name into a function that calls dplyr?
我正在尝试创建一个函数,它将从数据集中获取 2 个变量,并并排映射它们的不同值,然后将输出写入 csv 文件。我将使用 dplyr 的不同函数来获取唯一值。
map_table <- function(df, var1, var2){
df_distinct <- df %>% distinct(var1, var2)
write.csv(df_distinct, 'var1.csv')
}
map_table(iris, Species, Petal.Width)
1) map_table(iris, Species, Petal.Width) 没有产生我想要的结果。它应该产生 27 行数据,而我得到了 150 行数据。
2)输入var1后如何命名csv文件?
所以如果var1 = 'Sepal.Length',文件名应该是'Sepal.Length.csv'
您正在尝试将列作为对象传递。尝试传递他们的名字,然后使用 select 助手:
map_table <- function(df, var1, var2){
df_distinct <- df %>% select(one_of(c(var1, var2)))%>%
distinct()
write.csv(df_distinct, 'var1.csv')
}
map_table(iris, 'Species', 'Petal.Width')
1) 好的,答案是使用 distinct_ 而不是 distinct。并且被调用的变量需要撇号。
2) 使用 apply 函数连接 values/string 格式,和 file =
map_table <- function(df, var1, var2){
df_distinct <- df %>% distinct_(var1, var2)
write.csv(df_distinct, file = paste(var1,'.csv'))
}
map_table(iris, 'Species', 'Petal.Width')
如果要传递不带引号的列名,需要使用non-standard evaluation. (More here)
deparse(substitute())
将为您获取文件输出的名称。
library(dplyr)
map_table <- function(df, var1, var2){
file_name <- paste0(deparse(substitute(var1)), ".csv") # file name
var1 <- enquo(var1) # non-standard eval
var2 <- enquo(var2) # equo() caputures the expression passed, ie: Species
df_distinct <- df %>%
distinct(!!var1, !!var2) # non-standard eval, !! tells dplyr to use Species
write.csv(df_distinct, file = file_name)
}
map_table(iris, Species, Petal.Width)
我正在尝试创建一个函数,它将从数据集中获取 2 个变量,并并排映射它们的不同值,然后将输出写入 csv 文件。我将使用 dplyr 的不同函数来获取唯一值。
map_table <- function(df, var1, var2){
df_distinct <- df %>% distinct(var1, var2)
write.csv(df_distinct, 'var1.csv')
}
map_table(iris, Species, Petal.Width)
1) map_table(iris, Species, Petal.Width) 没有产生我想要的结果。它应该产生 27 行数据,而我得到了 150 行数据。
2)输入var1后如何命名csv文件? 所以如果var1 = 'Sepal.Length',文件名应该是'Sepal.Length.csv'
您正在尝试将列作为对象传递。尝试传递他们的名字,然后使用 select 助手:
map_table <- function(df, var1, var2){
df_distinct <- df %>% select(one_of(c(var1, var2)))%>%
distinct()
write.csv(df_distinct, 'var1.csv')
}
map_table(iris, 'Species', 'Petal.Width')
1) 好的,答案是使用 distinct_ 而不是 distinct。并且被调用的变量需要撇号。 2) 使用 apply 函数连接 values/string 格式,和 file =
map_table <- function(df, var1, var2){
df_distinct <- df %>% distinct_(var1, var2)
write.csv(df_distinct, file = paste(var1,'.csv'))
}
map_table(iris, 'Species', 'Petal.Width')
如果要传递不带引号的列名,需要使用non-standard evaluation. (More here)
deparse(substitute())
将为您获取文件输出的名称。
library(dplyr)
map_table <- function(df, var1, var2){
file_name <- paste0(deparse(substitute(var1)), ".csv") # file name
var1 <- enquo(var1) # non-standard eval
var2 <- enquo(var2) # equo() caputures the expression passed, ie: Species
df_distinct <- df %>%
distinct(!!var1, !!var2) # non-standard eval, !! tells dplyr to use Species
write.csv(df_distinct, file = file_name)
}
map_table(iris, Species, Petal.Width)