2017-01-25 7 views
0

Ich möchte eine Reihe von kategorischen Werte in Binärwerte kodieren. Zuerst konvertiert ich sie intToBin(x$y)Teilen Sie eine Spalte in mehrere Spalten, bestehend aus einer einzigen Zeichenfolge in R

Jetzt Binär ich mit diesen binären in separaten Spalten teilen möchten

0101 
0100 
0110 
0101 
0101 
0100 

zu

0 1 0 1 
0 1 0 0 
0 1 1 0 
0 1 0 1 

und so weiter und zugleich sie konvertieren wollen in numerische Werte. Es sollte auf eine größere Anzahl von Strings skalierbar sein.

Ich habe separate(x$y, sep = l) für die Konvertierung verwendet. Aber ich bekomme einen Fehler. Bitte helfen Sie mir bei der Korrektur des Codes oder anderen Alternativen. Der Zweck der Änderung der Werte in binär ist, ein Modell mit XGBoost zu erstellen.

An example of my requirement

+0

Um eine Matrix zu bekommen, 'as.integer (do.call (rbind, strsplit (as.zeichen (x $ y), split =" ")))' wird in der Basis R arbeiten, obwohl es a effizientere Methode. – lmo

+0

Vielen Dank für die Antwort. Aber, wie teile ich es in 4 separate Spalten? – cutepanda

+0

'stringr :: str_split_fixed (x $ y," ", 4)' –

Antwort

1

Dies ist ein Weg:

d=c("0101","0111","0011","1101") 
# Split into columns 
d2=do.call(rbind, strsplit(as.character(d), split="")) #see elmo's comments 
# Make numeric and transform to dataframe (instead of matrix) 
d2=as.data.frame(apply(d2,2, function(x) as.numeric(as.character(x)))) 
1
a = c("0101","0100","0110","0101","0101","0100") 
data.frame(t(matrix(unlist(strsplit(a,"")),nrow = 4))) 

ODER

data.frame(t(sapply(a, function(x) unlist(strsplit(x,""))))) 
#You may get a warning about identical row names 

ODER wenn Sie wollen etwas, das, wenn die Anzahl der Stellen von Elementen in a funktioniert nicht einheitlich,

a = c("01101","0100","0110","0101","0101","0100") #Note 1st element has 5 digits 
b = sapply(a, function(x) unlist(strsplit(x,""))) 
data.frame(t(sapply(b, '[', seq(max(sapply(b,length)))))) 
#You may get a warning about identical row names 
Verwandte Themen