我有下面的data.table
dtable <- data.table(column1 = c(1, 2, 3, 5, 6, 7, 8),
column2 = c(1, 1, 1, 5, 5, 6, 8),
column3 = c(7, 8, 9, 0, 9, 2, 3))我想做一些类似于以下功能的事情,但是在一个参数化的函数中:
dtable %>%
dplyr::group_by(column1) %>%
dplyr::summarise(Result = ifelse(column1 == column2, "A", "B"))为此,我创建了以下函数:
Test <- function(.df, .columnName, .columnToGroup){
res <- .df %>%
# This line is interpreted correctly
dplyr::group_by_(lazyeval::interp(.columnToGroup, .columnToGroup = as.name(.columnToGroup))) %>%
# This line does not interpret the == condition as a logical one
dplyr::summarise_(Result = ifelse((lazyeval::interp(.columnToGroup == .columnName,
.columnToGroup = as.name(.columnToGroup),
.columnName = as.name(.columnName))),
"A", "B"))
return(res)
}我使用的是非标准的评估函数(group_by_和summarise_)和lazyeval::interp函数,但是==条件没有被正确的解释,我得到了以下示例:
Test(dtable, "column1", "column2")
Error in UseMethod("interp") :
no applicable method for 'interp' applied to an object of class "logical"我尝试过许多不同的组合(quote,expr_env,as.lazy等)没有运气。多亏了这个伟大的非标准评价指南,我以前能够使用这些lazyeval函数来计算算术表达式,但是我无法找到在这段代码中解释逻辑条件的方法。
任何帮助都将不胜感激。
发布于 2017-04-10 14:22:46
使用ifelse,我们可以尝试(在注释中使用@docendodiscimus使用list )
Test <- function(.df, .columnName, .columnToGroup){
.df %>%
dplyr::group_by_(.dots = .columnToGroup )%>%
dplyr::summarise_(.dots =
setNames(list(lazyeval::interp(quote(ifelse(colGrp == colName,
"A", "B")), .values = list(colGrp = as.name(.columnToGroup),
colName = as.name(.columnName)))),
"Result"))
}
res2 <- Test(dtable, "column2", "column1")
identical(res1, res2)
#[1] TRUE“res1”在哪里
res1 <- dtable %>%
dplyr::group_by(column1) %>%
dplyr::summarise(Result = ifelse(column1 == column2, "A", "B"))更新
有了新版本的dplyr,即0.6.0 (2017年4月即将发布),我们也可以在group_by和summarise中取消报价。enquo函数通过使用输入参数来完成类似于来自base R的substitute的工作,可以创建一个quosure,并且在group_by和summarise中没有引用(!!或UQ)来进行计算。
Test1 <- function(df, colN, colGrp){
colN <- enquo(colN)
colGrp <- enquo(colGrp)
df %>%
group_by(!!colGrp) %>%
summarise(Result = if_else((!!colGrp) == (!!colN), "A", "B"))
}
res3 <- Test1(dtable, column2, column1)
identical(res2, res3)
#[1] TRUEhttps://stackoverflow.com/questions/43324976
复制相似问题