R - 制作二进制变量的函数

R - Function to make a binary variable

我有一些取值介于 1 和 5 之间的变量。如果它们取值介于 1 和 3(包括在内)和 [=26 之间,我想将它们编码为 0 =]1 如果它们取值 4 或 5.

我的数据集是这样的

var1    var2        var3
1       1            NA
4       3            4
3       4            5
2       5            3

所以我希望它是这样的:

var1    var2        var3
0       0            NA
1       0            1
0       1            1
0       1            0

我试着做一个函数并调用它

making_binary <- function (var){
  var <- factor(var >= 4, labels = c(0, 1))
  return(var)
}


df <- lapply(df, making_binary)

但是我有一个错误:incorrect labels : length 2 must be 1 or 1

我哪里错了? 非常感谢您的回答!

您可以使用:

df[] <- +(df == 4 | df == 5)
df
#  var1 var2 var3
#1    0    0   NA
#2    1    0    1
#3    0    1    1
#4    0    1    0

比较df == 4 | df == 5returns逻辑值(TRUE/FALSE),+这里把那些逻辑值转成整数值(1/0) 分别.

如果您想将此应用于选定的列,您可以按位置或名称对列进行子集化。

cols <- 1:3 #Position
#cols <- grep('var', names(df)) #Name
df[cols] <- +(df[cols] == 4 | df[cols] == 5)

就您的功能而言,您可以这样做:

making_binary <- function (var){
  var <- as.integer(var >= 4)
  #which is faster version of
  #var <- ifelse(var >= 4, 1, 0)
  return(var)
}

df[] <- lapply(df, making_binary)

数据

df <- structure(list(var1 = c(1L, 4L, 3L, 2L), var2 = c(1L, 3L, 4L, 
5L), var3 = c(NA, 4L, 5L, 3L)), class = "data.frame", row.names = c(NA, -4L))

我认为 ifelse 很适合这个问题:

df[] <- lapply(df, function(x) ifelse(x >=1 & x <=3, 0, x))
df
  var1 var2 var3
1    0    0   NA
2    4    0    4
3    0    4    5
4    0    5    0
df[] <- lapply(df, function(x) ifelse(x >=4 & x <=5, 1, x))

df
  var1 var2 var3
1    0    0   NA
2    1    0    1
3    0    1    1
4    0    1    0

如果您需要一次完成这两个步骤,可以查看dplyr::case_when()data.table::fcase()

您可以简单地测试该值是否大于 3,这将 return TRUEFALSE 并将其转换为数字:

+(x>3)
#     var1 var2 var3
#[1,]    0    0   NA
#[2,]    1    0    1
#[3,]    0    1    1
#[4,]    0    1    0

如果您只想对某些列进行此操作,则必须对它们进行子集化。例如。对于第 1 列和第 2 列:

+(x[1:2]>3)
#+(x[c("var1","var2")]>3)  #Alternative
#     var1 var2
#[1,]    0    0
#[2,]    1    0
#[3,]    0    1
#[4,]    0    1

数据:

x <- data.frame(var1 = c(1L, 4L, 3L, 2L), var2 = c(1L, 3L, 4L, 5L)
              , var3 = c(NA, 4L, 5L, 3L))