R 使用调用变量名的函数清除数据

R 使用调用变量名的函数清除数据,r,function,variables,nse,R,Function,Variables,Nse,我正在尝试编写一个清理变量的函数,将“*”替换为“1”,将NAs替换为“0”。我可以用ifelse轻松做到这一点,但我希望它是干净的,并使用函数式编程,但我显然还没有做到这一点 一个示例数据库是: db <- data.frame( name = c("Abel", "Abner", "Bianca", "Pedro", "Lucas"), scholarship1 = c("*", "*", "*", "*", NA), scholarship2 = c("*", NA, N

我正在尝试编写一个清理变量的函数,将“*”替换为“1”,将NAs替换为“0”。我可以用ifelse轻松做到这一点,但我希望它是干净的,并使用函数式编程,但我显然还没有做到这一点

一个示例数据库是:

db <- data.frame(
  name = c("Abel", "Abner", "Bianca", "Pedro", "Lucas"),
  scholarship1 = c("*", "*", "*", "*", NA),
  scholarship2 = c("*", NA, NA, "*", "*"))
)

db由于示例函数是逐属性的,下面是一个工作示例:

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")

假设你在找这样的东西<代码>二分法器=函数(数据库,变量){database[,variable]=ifelse(is.na(database[,variable]),'0',ifelse(database[,variable]='*','1',database[,variable])database}
然后调用
二分法器(db,'scholarship1')
我不知道你说的“使用函数式编程”是什么意思。你是说你想使用非标准评估(NSE)?你想如何调用你的函数?标准评估(SE)很容易(不需要
eval
替换
enquo
)如果您使用带引号的列名,例如,
二分法(db,“scholarship1”)
。肖恩上面的评论显示了一个SE解决方案。未带引号的列名
二分法(db,scholarship1)
需要NSE。此外,不要只说“不起作用”-描述它是如何工作的。如果出现错误,请发布错误消息。错误消息非常有用。如果没有出现错误但得到意外结果,请描述并解释错误原因。@SeanLin这对我的要求很有效!谢谢!@Gregor“函数式编程”部分是我认为我需要的…但我发现它不是必需的。我没有把错误信息放进去,因为我知道我的问题没有得到很好的解决,所以我选择忽略它。
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")