我有一些取值在 1 到 5 之间的变量。如果它们取值在 1 到 3(包括在内)和 1 之间,我想将它们编码为 0如果他们取值 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)
但我有一个错误:不正确的标签:长度 2 必须是 1 或 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
返回逻辑值(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))
关于R - 制作二进制变量的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62652518/