用 Y 为 1 和 N 为 0 替换特定列

时间:2021-02-20 14:44:37

标签: r

我有一个包含许多列的数据框,其中包含“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

1 个答案:

答案 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