2014-11-01 12 views
8

Ho bisogno di elaborare alcuni dati che sono per lo più csv. Il problema è che R ignora la virgola se arriva alla fine di una riga (ad es., Quella che viene dopo 3 nell'esempio sotto).Come svuotare gli ultimi elementi da strsplit() in R?

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

Mi piacerebbe leggerlo come [1] "1" "2" "3" NA invece. Come posso fare questo? Grazie.

risposta

9

Ecco un paio di idee

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 

Quei entrambi i vettori di ritorno interi. Puoi avvolgere as.character intorno a uno di loro per ottenere il risultato esatto si mostra nella Domanda:

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

In alternativa, è possibile specificare what="character" in scan, o colClasses="character" in read.csv per l'uscita leggermente diverso

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" "" 

È inoltre possibile specificare insieme a colClasses="character"

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

di Hadley stringi (e in precedenza stringr) le biblioteche sono un enorme miglioramento sulle funzioni di stringa di base (pienamente vettorializzare, funzione di interfaccia coerente):

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' è lento, dovresti usare 'stringi' :) –

+3

@silvaran sei completamente corretto, ho solo preso coscienza di' stringi' dopo averlo scritto. (Come diamine stare al di sopra del quale -ultimo-più grande-pacchetto in R?) – smci

3

Utilizzando stringi pacchetto:

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"