2014-11-01 5 views
8

Ich muss einige Daten verarbeiten, die meist csv sind. Das Problem ist, dass R das Komma ignoriert, wenn es am Ende einer Zeile steht (z. B. die, die im folgenden Beispiel nach 3 kommt).Wie bekomme ich letzte Elemente von strsplit() in R?

> strsplit("1,2,3,", ",") 
[[1]] 
[1] "1" "2" "3" 

Ich möchte es als [1] "1" "2" "3" NA stattdessen eingelesen werden. Wie kann ich das machen? Vielen Dank.

Antwort

9

Hier sind ein paar Ideen

scan(text="1,2,3,", sep=",", quiet=TRUE) 
#[1] 1 2 3 NA 

unlist(read.csv(text="1,2,3,", header=FALSE), use.names=FALSE) 
#[1] 1 2 3 NA 

Diese beiden Rückkehr ganzzahlige Vektoren. Sie können as.character um eine von ihnen wickeln die genaue Ausgabe, die Sie in der Frage zeigen zu bekommen:

as.character(scan(text="1,2,3,", sep=",", quiet=TRUE)) 
#[1] "1" "2" "3" NA 

Oder Sie what="character" in scan oder colClasses="character" in read.csv für etwas anderen Ausgang

scan(text="1,2,3,", sep=",", quiet=TRUE, what="character") 
#[1] "1" "2" "3" "" 

unlist(read.csv(text="1,2,3,", header=FALSE, colClasses="character"), use.names=FALSE) 
#[1] "1" "2" "3" "" 

geben könnte Sie könnten auch na.strings="" angeben zusammen mit colClasses="character"

unlist(read.csv(text="1,2,3,", header=FALSE, colClasses="character", na.strings=""), 
     use.names=FALSE) 
#[1] "1" "2" "3" NA 
6

Hadleys stringi (und zuvor stringr) Bibliotheken sind eine riesige Verbesserung auf String-Funktionen Basis (voll vektorisiert, konsistente Funktionsschnittstelle):

require(stringr) 
str_split("1,2,3,", ",") 

[1] "1" "2" "3" "" 

as.integer(unlist(str_split("1,2,3,", ","))) 
[1] 1 2 3 NA 
+3

'stringr' ist langsam, Sie sollten 'stringi' verwenden :) –

+3

@silvaran Sie sind völlig richtig, ich wurde nur auf' stringi' aufmerksam, nachdem ich das geschrieben habe. (Wie um alles in der Welt bleibe ich auf dem neusten Paket in R?) – smci

3

Mit stringi Paket:

require(stringi) 
> stri_split_fixed("1,2,3,",",") 
[[1]] 
[1] "1" "2" "3" "" 
## you can directly specify if you want to omit this empty elements 
> stri_split_fixed("1,2,3,",",",omit_empty = TRUE) 
[[1]] 
[1] "1" "2" "3"