【发布时间】:2017-09-24 07:24:08
【问题描述】:
例如,假设您有一个应用了一些 DPLYR 函数的函数,但您不能期望传递给该函数的数据集具有相同的列名。
对于我的意思的简化示例,假设您有一个数据框,arizona.trees:
arizona.trees
group arizona.redwoods arizona.oaks
A 23 11
A 24 12
B 9 8
B 10 7
C 88 22
和另一个非常相似的数据框,california.trees:
california.trees
group california.redwoods california.oaks
A 25 50
A 11 33
B 90 5
B 77 3
C 90 35
并且您想要实现一个函数,该函数返回给定类型的树的给定组(A、B、... Z)的平均值,该树适用于这两个数据帧。
foo <- function(dataset, group1, group2, tree.type) {
column.name <- colnames(dataset[2])
result <- filter(dataset, group %in% c(group1, group2) %>%
select(group, contains(tree.type)) %>%
group_by(group) %>%
summarize("mean" = mean(column.name))
return(result)
}
foo(california.trees, A, B, redwoods) 调用的期望输出是:
result
mean
A 18
B 83.5
出于某种原因,执行foo() 之类的操作似乎不起作用。这可能是由于数据框索引的一些错误 - 该函数似乎认为我正在尝试获取column.name 字符串的平均值,而不是检索列并将列传递给mean()。我不确定如何避免这种情况。存在隐式传递修改后的数据帧的问题,可能导致问题的管道运算符无法直接引用该数据帧。
这是为什么?有没有其他可行的实现方式?
【问题讨论】:
-
您必须阅读 dplyr (cran.r-project.org/web/packages/dplyr/vignettes/nse.html) 的“非标准评估”(nse) 插图,并注意此方法将在下一个 dplyr 版本中更改 (dplyr.tidyverse.org/articles/programming.html)