2017-10-11 4 views
1

Dies ist so eine grundlegende Frage, ich bin peinlich zu fragen.Convert begrenzte Zeichenfolge in numerischen Vektor in Datenrahmen

Lassen Sie uns sagen, ich habe eine Datenrahmen voller Spalten, die Daten der folgenden Form enthalten:

test <-"3000,9843,9291,2161,3458,2347,22925,55836,2890,2824,2848,2805,2808,2775,2760,2706,2727,2688,2727,2658,2654,2588" 

Ich möchte diese in einen numerischen Vektor konvertieren, die ich wie so getan haben:

test <- as.numeric(unlist(strsplit(test, split=","))) 

ich mag jetzt einen großen Datenrahmen enthält eine Spalte voll diese Daten in einen numerischen Vektor äquivalent konvertieren:

mutate(data, 
    converted = as.numeric(unlist(strsplit(badColumn, split=","))), 
) 
vermutlich

Das funktioniert nicht, weil es die gesamte Spalte in einen numerischen Vektor Konvertierung und dann eine einzelne Zeile mit diesem Wert zu ersetzen:

Error in mutate_impl(.data, dots) : Column converted must be length 20 (the number of rows) or one, not 1274

Wie kann ich das tun?

+0

Die Spalte ist zu lang, nachdem Sie sie aufgeteilt haben. Es sieht so aus, als ob Ihre Daten nur 20 Zeilen haben, aber die geteilte Spalte hat 1274 Elemente. Wenn Sie es nicht als neue Spalte in den Daten zuweisen möchten (was mutate tut), können Sie 'as.numeric (unlist (strsplit (data $ badColumn, split =", ")))' –

+0

Ich verstehe, aber ich bin verwirrt, warum das der Fall ist. Die aktuellen Zeilen enthalten Werte wie "10, 20, 30, 40". Ich möchte nur, dass diese Werte durch ein numerisches Vektoräquivalent c (10, 20, 30, 40) ersetzt werden. – Parseltongue

+0

Sie möchten also mehrere numerische Werte in einer bestimmten Zeile? Z.B. Zeile 1 könnte 'c (10,20,30)' haben? –

Antwort

1

Hier einige Beispieldaten, die Ihre Fehler reproduziert:

data <- data.frame(a = 1:3, 
        badColumn = c("10,20,30,40,50", "1,2,3,4,5,6", "9,8,7,6,5,4,3"), 
        stringsAsFactors = FALSE) 

Hier ist der Fehler:

library(tidyverse) 
mutate(data, converted = as.numeric(unlist(strsplit(badColumn, split=",")))) 
# Error in mutate_impl(.data, dots) : 
# Column `converted` must be length 3 (the number of rows) or one, not 18 

Eine einfache Art und Weise nur strsplit auf die gesamte Spalte nutzen würde, und lapply ... as.numeric, um die resultierenden Listenwerte von Zeichenvektoren in numerische Vektoren zu konvertieren.

x <- mutate(data, converted = lapply(strsplit(badColumn, ",", TRUE), as.numeric)) 
str(x) 
# 'data.frame': 3 obs. of 3 variables: 
# $ a  : int 1 2 3 
# $ badColumn: chr "10,20,30,40,50" "1,2,3,4,5,6" "9,8,7,6,5,4,3" 
# $ converted:List of 3 
# ..$ : num 10 20 30 40 50 
# ..$ : num 1 2 3 4 5 6 
# ..$ : num 9 8 7 6 5 4 3 
1

Base-R

A=c(as.numeric(strsplit(test,',')[[1]])) 

A 
[1] 3000 9843 9291 2161 3458 2347 22925 55836 2890 2824 2848 2805 2808 2775 2760 2706 2727 2688 2727 2658 2654 2588 


df$NEw2=lapply(df$NEw, function(x) c(as.numeric(strsplit(x,',')[[1]]))) 

df%>%mutate(NEw2=list(c(as.numeric(strsplit(NEw,',')[[1]])))) 
+0

Dies repliziert nur die Funktion, die ich bereits oben hatte. Mein Problem ist physikalisch ersetzen die Spalte im Datenrahmen (die derzeit die Zeichenfolgen enthält) mit dem numerischen Vektor entspricht – Parseltongue

+0

@Parseltongue überprüfen Sie das Update – Wen

2

Dies könnte helfen:

library(purrr) 

mutate(data, converted = map(badColumn, function(txt) as.numeric(unlist(strsplit(txt, split = ","))))) 

Was man bekommt, ist eine Liste Spalte, die die numerischen Vektoren enthalten.

+0

Ja, Sie haben Recht. Ich habe meine Antwort bearbeitet. – kath

+0

Das ist eine gute Antwort - danke kath. Ich akzeptiere A5s Antwort, da es mir etwas klarer erscheint – Parseltongue