将逻辑值(TRUE / FALSE)替换为数值(1 / 0)
将逻辑值(TRUE / FALSE)替换为数值(1 / 0)
我正在使用以下命令从R中导出数据:
write.table(output, file = "data.raw", na = "-9999", sep = "\t", row.names = FALSE, col.names = FALSE)
它能正确导出我的数据,但是逻辑变量被导出为TRUE
和FALSE
。
我需要将数据读入另一个只能处理数值的程序中。在导出时,有没有一种高效的方法将logical
列转换为数值1和0?我有大量数值变量,所以希望能够自动循环遍历数据表中的所有变量。
另外,我的输出对象是一个data.table
。有没有一种高效的方法将data.table
中的所有逻辑变量转换为数值变量?
如果有帮助的话,这里有一些生成一个包含逻辑变量的data.table
的代码(不是大量的逻辑变量,但足够用于示例代码):
DT = data.table(cbind(1:100, rnorm(100) > 0)) DT[, V3:= V2 == 1] DT[, V4:= V2 != 1]
问题出现的原因:
在某些情况下,我们需要将逻辑值(TRUE / FALSE)替换为数字值(1 / 0)。这可能是因为我们需要对逻辑值进行数学运算或者将其用于其他需要数字值的操作中。
解决方法:
最简单的方法就是将矩阵与1相乘。具体操作如下:
A <- matrix(c(TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE),ncol=4)
A
# [,1] [,2] [,3] [,4]
# [1,] TRUE TRUE TRUE FALSE
# [2,] FALSE TRUE FALSE TRUE
B <- 1*A
B
# [,1] [,2] [,3] [,4]
# [1,] 1 1 1 0
# [2,] 0 1 0 1
另外,我们也可以使用B <- 0 + A
的方式来实现。
不仅这种方法最简单,而且速度也是最快的。
问题的出现原因:
在数据分析中,我们经常需要将逻辑值(TRUE / FALSE)转换为数值(1 / 0),以便进行数值计算或其他操作。然而,在R语言中,数据框(data.frame)或数据表(data.table)中的逻辑列默认以逻辑值的形式存储。为了将它们转换为数值,我们需要使用特定的函数来实现。
解决方法:
在数据框中,我们可以使用sapply()函数来判断每一列是否为逻辑列,然后再使用lapply()函数将逻辑列转换为数值列。在数据表中,我们可以使用sapply()函数和get()函数结合来实现相同的操作。
具体代码如下:
对于数据框(data.frame):
# The data set.seed(144) dat <- data.frame(V1=1:100,V2=rnorm(100)>0) dat$V3 <- dat$V2 == 1 head(dat) # Convert all to numeric cols <- sapply(dat, is.logical) dat[,cols] <- lapply(dat[,cols], as.numeric) head(dat)
对于数据表(data.table):
# Data set.seed(144) DT = data.table(cbind(1:100,rnorm(100)>0)) DT[,V3 := V2 == 1] DT[,V4 := FALSE] head(DT) # Converting (to.replace <- names(which(sapply(DT, is.logical)))) for (var in to.replace) DT[, (var):= as.numeric(get(var))] head(DT)
通过以上代码,我们可以将逻辑列转换为数值列,方便后续的数据分析和计算。