【发布时间】:2018-10-18 15:04:31
【问题描述】:
我正在尝试编写一个清理变量的函数,将“*”替换为“1”,将 NAs 替换为“0”。我可以用 ifelse 轻松做到这一点,但我希望它干净并使用函数式编程,但我显然还没有……
一个示例数据库是:
db <- data.frame(
name = c("Abel", "Abner", "Bianca", "Pedro", "Lucas"),
scholarship1 = c("*", "*", "*", "*", NA),
scholarship2 = c("*", NA, NA, "*", "*"))
)
我的功能是这样的:
Dichotomizer <- function(database, variable) {
variable <- enquo(variable)
database$variable <- ifelse(
is.na(database$variable),
0,
1
)
}
但它显然不起作用,我不知道为什么......我尝试使用 eval 和替代,但它仍然会导致错误。
感谢您为解决我的问题提供的任何意见。谢谢。
【问题讨论】:
-
假设您正在寻找这样的东西?
Dichotomizer = function(database, variable) { database[, variable] = ifelse(is.na(database[, variable]), '0', ifelse(database[, variable] == '*', '1', database[, variable])) database }然后拨打Dichotomizer(db, 'scholarship1') -
我不确定您所说的“使用函数式编程”是什么意思。您的意思是要使用非标准评估 (NSE)?你想如何调用你的函数?如果您使用带引号的列名,例如
Dichotomizer(db, "scholarship1"),标准评估 (SE) 将很容易(不需要eval、substitute、enquo...)。肖恩上面的评论显示了一个 SE 解决方案。未加引号的列名Dichotomizer(db, scholarship1)需要 NSE。 -
另外,永远不要只说“不起作用”——描述它是如何不起作用的。如果您收到错误,请发布错误消息。错误消息非常有用。如果您没有收到错误但得到了意外的结果,请描述并解释错误的原因。
-
@SeanLin 这很适合我想要的!谢谢!
-
@Gregor “函数式编程”部分是我认为我需要的......但我发现它不需要。而且我没有提供错误消息,因为我知道我的问题还没有得到很好的解决方案,所以我选择省略了。