gpt4 book ai didi

r - dplyr:对带引号的变量名进行 mutate 的标准评估

转载 作者:行者123 更新时间:2023-12-04 14:57:29 24 4
gpt4 key购买 nike

我将如何使用 mutate (我的假设是在我的情况下我正在寻找标准评估,因此 mutate_ ,但我对这一点并不完全有信心)使用接受变量名称列表的函数时,例如:

createSum = function(data, variableNames) {
data %>%
mutate_(sumvar = interp(~ sum(var, na.rm = TRUE),
var = as.name(paste(as.character(variableNames), collapse =","))))

}

这是一个 MWE,它将函数剥离到其核心逻辑并演示了我想要实现的目标:
library(dplyr)
library(lazyeval)

# function to make random table with given column names
makeTable = function(colNames, sampleSize) {
liSample = lapply(colNames, function(week) {
sample = rnorm(sampleSize)
})
names(liSample) = as.character(colNames)
return(tbl_df(data.frame(liSample, check.names = FALSE)))
}

# create some sample data with the column name patterns required
weekDates = seq.Date(from = as.Date("2014-01-01"),
to = as.Date("2014-08-01"), by = "week")
dfTest = makeTable(weekDates, 10)

# test mutate on this table
dfTest %>%
mutate_(sumvar = interp(~ sum(var, na.rm = TRUE),
var = as.name(paste(as.character(weekDates), collapse =","))))

此处的预期输出是将返回的内容:
rowSums(dfTest[, as.character(weekDates)])

最佳答案

我想这就是你所追求的

createSum = function(data, variableNames) {
data %>%
mutate_(sumvar = paste(as.character(variableNames), collapse ="+"))
}
createSum(dfTest, weekDates)

我们只提供一个字符值而不是 interp因为您不能将名称列表作为单个参数传递给函数。另外, sum()会做一些不需要的折叠,因为操作不是按行执行的,它们一次在向量列中传递。

这个例子的另一个问题是你设置了 check.names=FALSE在您的 data.frame 中,这意味着您创建了不能是有效符号的列名。如果您愿意,您可以将变量名显式地包装在反引号中
createSum(dfTest , paste0("`", weekDates,"`"))

但总的来说,最好不要使用无效名称。

关于r - dplyr:对带引号的变量名进行 mutate 的标准评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30108105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com