2016-05-12 2 views
1

Ich habe einen Charakter Vektor, der folgenden Form zu bewahren:aber die Reihenfolge

vv<-c(1,2,"c", "2%", 3, "b", "4%") # original vector 

Von diesem Vektor I nach den folgenden Codezeilen ein paar neue Vektoren erstellt:

# original vector  
vv<-c(1,2,"c", "2%", 3, "b", "4%") 

# vector without the characters , i.e the c and b 
vv1<-vv[-grep("[a-zA-Z]", vv)]     

# Steps to create the vector of "integers" 
strip_percents <- as.numeric(gsub("%", "", vv1))  
no_percents <- as.numeric(vv1[-grep("%", vv1)])  

# Vector that collects the strings 
strings_vv1 <- vv[grep("[a-zA-Z]", vv)]   


# Vector the collects the percentage numbers 
perce_vv1 <-vv1[grep("%", vv1)] 
perce_vv1 <- as.numeric(gsub("%", "", perce_vv1))/100 

Mein Ziel ist es, alle diese Vektoren zu kombinieren und einen Datenrahmen erstellen, aber gegliederte/Ordnung des ursprünglichen Vektors. Mit anderen Worten, ich möchte den Datenrahmen mit NAs an "richtigen Stellen" füllen. So zum Beispiel möchte mein Datenrahmen wie folgt aussehen:

df<-data.frame(original=vv, numerics=c(1,2,NA,0.02,3,NA,0.04), integers=c(1,2,NA,NA,3,NA,NA), characters=c(NA,NA,"c",NA,NA,"b",NA)) 



original numerics integers characters 
1  1  1.00  1  <NA> 
2  2  2.00  2  <NA> 
3  c  NA  NA   c 
4  2%  0.02  NA  <NA> 
5  3  3.00  3  <NA> 
6  b  NA  NA   b 
7  4%  0.04  NA  <NA> 

Kann mir jemand bei dieser Aufgabe helfen?

Antwort

2

Wir können einen numerischen Index der Elemente mit % ('i1') erstellen, dann diejenigen mit % durch /100 ersetzen, die Zeichenfolge auswerten und die Ausgabe zurück zuweisen. Die Anwendung von as.numeric auf den geänderten Vektor ('vv1') ergibt NA für alle nicht-numerischen Werte, ebenso können wir as.integer auf dem ursprünglichen Vektor ('vv') ausführen und alle nicht-numerischen Werte zu NA erhalten. Die Elemente mit Buchstaben können mit grepl identifiziert werden und alle anderen Elemente mit ifelse in NA konvertiert werden.

vv1 <- vv 
i1 <- grep("%", vv) 
library(gsubfn) 
vv1[i1] <- sapply(gsubfn(".", list(`%`="/100"), vv[i1]), function(x) eval(parse(text=x))) 
vv1 <- as.numeric(vv1) 
vv2 <- as.integer(vv) 
vv3 <- ifelse(grepl("^[A-Za-z]+$", vv), vv, NA) 
data.frame(original=vv, numerics=vv1, integer=vv2, characters=vv3) 
# original numerics integer characters 
#1  1  1.00  1  <NA> 
#2  2  2.00  2  <NA> 
#3  c  NA  NA   c 
#4  2%  0.02  NA  <NA> 
#5  3  3.00  3  <NA> 
#6  b  NA  NA   b 
#7  4%  0.04  NA  <NA> 
+0

es funktionierte dank. Aber ich habe etwas vergessen. Wenn der ursprüngliche Vektor auch Daten enthält, was wäre anders, wenn ich einen neuen Vektor erstellen möchte, der die Daten sammelt und alle Vektoren erneut kombiniert, um den Datenrahmen wie zuvor zu erstellen? – msh855

+0

In meiner Datenbank ist das Äquivalent von c und b sind Sätze und scheint nicht zu sammeln, diejenigen in dem Vektor "Charakter" im obigen Beispiel. – msh855

+0

@ msh855 Wenn Leerzeichen dazwischen sind, benötigen Sie möglicherweise^^ [A-Za-z] + $ ' – akrun

Verwandte Themen