【发布时间】:2019-09-13 04:14:41
【问题描述】:
我创建了一个 dplyr 函数来评估人口的事件计数。该代码与 dplyr::filter 和 dplyr::group_by 函数中的变量的显式命名一起使用时有效。
我需要将该函数应用于 24 个变量,这些变量是数据框中的列标题。在这里它们被称为 x。
我用过!!据我了解,该变量被评估为字符串而不是列名。
函数
summary_table <- function(x){
assign(paste(x,"sum_tab", sep="_"),
envir = parent.frame(),
value = df %>%
filter(!is.na(!!x)) %>%
group_by(!!x) %>%
summarise(
'Variable name' = paste0(x),
Discharged = sum(admission_status == "Discharged"),
'Re-attended' = sum(!is.na(re_admission_status)),
'Admitted on Re-attendance' = sum(re_admission_status == "Admitted", na.rm = TRUE)))
}
我用过:
sapply(var_names, summary_table)
但是,这只会为列表 var_names 中的每个变量输出表的一行
总之,我想要指向正确机制的指针,以将上面编写的函数应用于 dplyr 管道中的列名列表。
可重现的示例
example <- mtcars %>%
group_by(vs) %>%
summarise(
'6 cylinder' = sum(cyl == 6),
'Large disp' = sum(disp >= 100),
'low gears' = sum(gear <= 4))
})
在本例中,我们希望将此函数应用于以下列表
cars_var <- c("vm", "am", "carb")
这将为列表中的每一列生成三个表格。
【问题讨论】:
-
您能否提供适用于您的代码的数据示例?这将使您更容易理解您的代码试图做什么并开发解决方案。你打算
assign声明做什么?assign步骤可能是不必要且不可取的。!!是“取消引用”x参数。但要使其工作,首先必须通过在函数开头执行x = enquo(x)来“引用”(或在本例中为“准引用”)x。有关这方面的更多信息,请参阅programming withdplyr。 -
例如我写的here's a recent answer在一个函数中使用了
enquo和!!。 -
抱歉回复延迟。我在函数中使用了assign,因为我想为函数的每个循环输出一个命名变量。我不确定我是否正确实施了这一点。我看过你的帖子和威克姆的章节。关于我是否应该使用 x = enqote(var_names) 然后使用 !!x 或 enquote(...) 然后使用 !!! 似乎存在矛盾
-
我添加了一个例子。