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 == 5
returns逻辑值(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 TRUE
和 FALSE
并将其转换为数字:
+(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))
我有一些取值介于 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 == 5
returns逻辑值(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 TRUE
和 FALSE
并将其转换为数字:
+(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))