我使用以下命令从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 ]
这似乎是一个简单的问题,但它让我失望,所以谢谢你的帮助!
答案 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
我不知道我的代码是否正在执行,但是它检查所有列并仅将那些逻辑更改为数字。当然,如果您的FALSE
和for(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)