在R中导出数据时,如何用1和0替换TRUE和FALSE值?

时间:2015-06-19 16:41:06

标签: r data.table

我使用以下命令从R导出数据:

write.table(output,file="data.raw", na "-9999",sep="\t",row.names=F,col.names=F)

正确导出我的数据,但它将所有逻辑变量导出为TRUE和FALSE。

我需要将数据读入另一个只能处理数值的程序。有没有一种有效的方法在导出期间将这些转换为数字1和0?我有大量的数值变量,所以我希望自动遍历data.table中的所有变量

我意识到我可以在输出数据上运行简单的sed脚本,但看起来这应该是从R直接做的。

或者,我的输出对象是data.table。有没有一种有效的方法将data.table中的所有逻辑变量转换为数值变量?

如果它有用,这里有一些代码来生成一个带有逻辑变量的data.table(它不是大量的逻辑变量,但足以用于示例代码):

DT = data.table(cbind(1:100,rnorm(100)>0)
DT[ ,V3:= V2==1 ]
DT[ ,V4:= V2!=1 ]

这似乎是一个简单的问题,但它让我失望,所以谢谢你的帮助!

7 个答案:

答案 0 :(得分:20)

对于data.frame,您可以将所有逻辑列转换为数字:

data.table

# Data set.seed(144) DT = data.table(cbind(1:100,rnorm(100)>0)) DT[,V3 := V2 == 1] DT[,V4 := FALSE] head(DT) # V1 V2 V3 V4 # 1: 1 0 FALSE FALSE # 2: 2 1 TRUE FALSE # 3: 3 0 FALSE FALSE # 4: 4 0 FALSE FALSE # 5: 5 0 FALSE FALSE # 6: 6 1 TRUE FALSE # Converting (to.replace <- names(which(sapply(DT, is.logical)))) # [1] "V3" "V4" for (var in to.replace) DT[, (var):= as.numeric(get(var))] head(DT) # V1 V2 V3 V4 # 1: 1 0 0 0 # 2: 2 1 1 0 # 3: 3 0 0 0 # 4: 4 0 0 0 # 5: 5 0 0 0 # 6: 6 1 1 0 语法:

{{1}}

答案 1 :(得分:8)

只是一个:

dplyr

或其他方法可以与library(dplyr) dat <- dat %>% mutate(lon = as.numeric(lo)) dat Source: local data frame [10 x 3] le lo lon 1 a TRUE 1 2 b FALSE 0 3 c TRUE 1 4 d FALSE 0 5 e TRUE 1 6 f FALSE 0 7 g TRUE 1 8 h FALSE 0 9 i TRUE 1 10 j FALSE 0 一起保留前一列,如果案例(没有人知道),您的数据将被导入R中。

TRUE

编辑:循环

我不知道我的代码是否正在执行,但是它检查所有列并仅将那些逻辑更改为数字。当然,如果您的FALSEfor(i in 1:ncol(dat)){ if(is.logical(dat[, i]) == TRUE) dat[, i] <- as.numeric(dat[, i]) } 不符合逻辑但字符串(可能是远程的),我的代码将无效。

{{1}}

答案 2 :(得分:8)

如果有多列,您可以使用set(使用@ josilber的示例)

library(data.table)
Cols <-  which(sapply(dat, is.logical))
setDT(dat)

for(j in Cols){
 set(dat, i=NULL, j=j, value= as.numeric(dat[[j]]))
}

答案 3 :(得分:6)

最简单的方法!

将矩阵乘以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 FUE是

B <- 1*A
B

#[,1] [,2] [,3] [,4]
  #[1,] 1 1 1 0
  #[2,] 0 1 0 1

(您也可以添加零:B <- 0+A

答案 4 :(得分:4)

作为Ted Harding pointed out in the R-help mailing list,将逻辑对象转换为数字的一种简单方法是对它们执行算术运算。方便的是* 1+ 0,它们将保持TRUE / FALSE == 1/0范例。

对于你的模拟数据(我已经改变了一些代码以使用常规R包并减小尺寸):

df    <- data.frame(cbind(1:10, rnorm(10) > 0))
df$X3 <- df$X2 == 1
df$X4 <- df$X2 != 1

您获得的数据集包含数字和布尔变量的混合:

   X1 X2    X3    X4
1   1  0 FALSE  TRUE
2   2  0 FALSE  TRUE
3   3  1  TRUE FALSE
4   4  1  TRUE FALSE
5   5  1  TRUE FALSE
6   6  0 FALSE  TRUE
7   7  0 FALSE  TRUE
8   8  1  TRUE FALSE
9   9  0 FALSE  TRUE
10 10  1  TRUE FALSE

现在让

df2 <- 1 * df

(如果您的数据集包含字符或因子变量,则需要将此操作应用于过滤掉这些变量的df子集)

df2等于

   X1 X2 X3 X4
1   1  0  0  1
2   2  0  0  1
3   3  1  1  0
4   4  1  1  0
5   5  1  1  0
6   6  0  0  1
7   7  0  0  1
8   8  1  1  0
9   9  0  0  1
10 10  1  1  0

这是100%数字,因为str(df2)会向您显示。

现在您可以安全地将df2导出到其他程序。

答案 5 :(得分:2)

一线解决方案

使用以下代码,我们将所有逻辑列都设为数字。

library(magrittr)
dat %<>% mutate_if(is.logical,as.numeric) 

答案 6 :(得分:1)

与@saebod 相同,但使用普通管道。

<块引用>

图书馆(dplyr)
dat <- dat %>% mutate_if(is.logical, as.numeric)