Как я могу заменить 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
)