【问题标题】:Clean data using function that calls variable names [duplicate]使用调用变量名的函数清理数据[重复]
【发布时间】: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) 将很容易(不需要 evalsubstituteenquo...)。肖恩上面的评论显示了一个 SE 解决方案。未加引号的列名 Dichotomizer(db, scholarship1) 需要 NSE。
  • 另外,永远不要只说“不起作用”——描述它是如何不起作用的。如果您收到错误,请发布错误消息。错误消息非常有用。如果您没有收到错误但得到了意外的结果,请描述并解释错误的原因。
  • @SeanLin 这很适合我想要的!谢谢!
  • @Gregor “函数式编程”部分是我认为我需要的......但我发现它不需要。而且我没有提供错误消息,因为我知道我的问题还没有得到很好的解决方案,所以我选择省略了。

标签: r function variables nse


【解决方案1】:

由于您的示例函数是逐个属性的,因此以下是一个工作示例:

db <- data.frame(
    name = c("a", "b", "c", "d", "e"),
    scholarship1 = c("*", "*", "*", "*", NA),
    scholarship2 = c("*", NA, NA, "*", "*"))

dichotomizer <- function(database, variable) {
    copy <- rep(0, nrow(database[variable]))
    copy[which(database[variable] == "*")] = 1
    database[variable] <- copy
    return(database)
}

new_db <- dichotomizer(db, "scholarship1")
final_db <- dichotomizer(new_db, "scholarship2")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2014-02-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2013-12-08
    相关资源
    最近更新 更多