Как я могу заменить TRUE и FALSE значения 1 и 0 при экспорте данных в R?

Я экспортирую данные из R с помощью команды:

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

который экспортирует мои данные правильно, но он экспортирует все логические переменные как TRUE и FALSE.

Мне нужно прочитать данные в другую программу, которая может обрабатывать только числовые значения. Есть ли эффективный способ конвертировать их в числовые 1 и 0 во время экспорта? У меня большое число числовых переменных, поэтому я надеялся автоматически перебрать все переменные в data.table

Я понимаю, что могу выполнить простой sed script для выходных данных, но похоже, что это должно быть прямо из R.

В качестве альтернативы мой выходной объект является таблицей данных. Есть ли эффективный способ преобразования всех логических переменных в data.table в числовые переменные?

В случае, если это полезно, вот какой-то код для генерации data.table с логической переменной в нем (это не большое количество логических переменных, но достаточно для использования на примере кода):

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

Это кажется легким вопросом, но его бросает меня, поэтому спасибо за помощь!

Ответ 1

Для data.frame вы можете преобразовать все логические столбцы в числовые с помощью:

# The data
set.seed(144)
dat <- data.frame(V1=1:100,V2=rnorm(100)>0)
dat$V3 <- dat$V2 == 1
head(dat)
#   V1    V2    V3
# 1  1 FALSE FALSE
# 2  2  TRUE  TRUE
# 3  3 FALSE FALSE
# 4  4 FALSE FALSE
# 5  5 FALSE FALSE
# 6  6  TRUE  TRUE

# Convert all to numeric
cols <- sapply(dat, is.logical)
dat[,cols] <- lapply(dat[,cols], as.numeric)
head(dat)
#   V1 V2 V3
# 1  1  0  0
# 2  2  1  1
# 3  3  0  0
# 4  4  0  0
# 5  5  0  0
# 6  6  1  1

В синтаксисе 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

Ответ 2

Если имеется несколько столбцов, вы можете использовать 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

Как насчет просто:

dat <- data.frame(le = letters[1:10], lo = rep(c(TRUE, FALSE), 5))
dat
   le    lo
1   a  TRUE
2   b FALSE
3   c  TRUE
4   d FALSE
5   e  TRUE
6   f FALSE
7   g  TRUE
8   h FALSE
9   i  TRUE
10  j FALSE
dat$lo <- as.numeric(dat$lo)
dat
   le lo
1   a  1
2   b  0
3   c  1
4   d  0
5   e  1
6   f  0
7   g  1
8   h  0
9   i  1
10  j  0

или другой подход может быть с dplyr, чтобы сохранить предыдущий столбец, если случай (никто не знает) ваши данные будут импортированы в R.

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

Edit: Loop

Я не знаю, работает ли здесь мой код, но он проверяет все столбцы и меняет числовые только на логические. Конечно, если ваши TRUE и FALSE не являются логическими, но символьными строками (которые могут быть удаленно), мой код не будет работать.

for(i in 1:ncol(dat)){

    if(is.logical(dat[, i]) == TRUE) dat[, i] <- as.numeric(dat[, i]) 

    }

Ответ 4

Как Тед Хардинг указал в списке рассылки R-help, один простой способ преобразования логических объектов в числовой - выполнить арифметику на них. Удобными будут * 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

Простейший способ сделать это!

Умножьте свою матрицу на 1

Например:

A <- matrix(c(TRUE,FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE),ncol=4)
A

#                       [3]       [4]
# [1,] 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)