我有一个包含许多列的数据框,其中包含“Y”和“N”。所以我试图创建一个函数,以便将“Y”替换为 1,将“N”替换为 0。但并非所有列都需要替换,而只有少数列需要替换。
res
ColA ColB ColC ColD ColE
A Y N Y N
B N N N N
A N N Y
B Y Y N Y
所以基本上,我们可以用下面的代码替换。但是我们必须重复很多次。
res$ColB <- ifelse(res$ColB == "Y",1,ifelse(res$ColB == "N", 0 , NA))
我们可以创建一个像下面这样的函数,这样一旦我们将参数作为列名传递,函数就应该小心。如下示例(不起作用)
binary_format <- function(df, x,...){
df$x <- ifelse(df[[x == "Y",1,ifelse(df$x == "N", 0 , NA))
return(df)
}
预期输出
binary_format(res, ColB, ColC)
ColA ColB ColC ColD ColE
A 1 0 Y N
B 0 0 N N
A 0 N Y
B 1 1 N Y
答案 0 :(得分:1)
dat <- read.table(header=T, text = "ColA ColB ColC ColD ColE
# A Y N Y N
# B N N N N
# A N . N Y
# B Y Y N Y")
binary_format <- function(x, nms) {
x[,nms] <- lapply(x[,nms], function(z) c(N = 0L, Y = 1L)[z])
x
}
binary_format(dat, c("ColB", "ColC"))
# ColA ColB ColC ColD ColE
# 1 A 1 0 Y N
# 2 B 0 0 N N
# 3 A 0 NA N Y
# 4 B 1 1 N Y
或者,
binary_format <- function(x, ...) {
nms <- unlist(list(...))
x[,nms] <- lapply(x[,nms], function(z) c(N = 0L, Y = 1L)[z])
x
}
binary_format(dat, "ColB", "ColC")
使用 NSE(非标准评估)能够使用非引用名称是可行的,但如果您的唯一目的是代码高尔夫,那么我建议不要这样做。话虽如此,
binary_format <- function(x, ...) {
nms <- as.character(substitute(alist(...)))[-1]
x[, nms] <- lapply(x[, nms], function(z) c(N = 0L, Y = 1L)[z])
x
}
binary_format(dat, ColB, ColC)
# ColA ColB ColC ColD ColE
# 1 A 1 0 Y N
# 2 B 0 0 N N
# 3 A 0 NA N Y
# 4 B 1 1 N Y