2014-11-01 2 views
8

Мне нужно обработать некоторые данные, которые в основном являются csv. Проблема в том, что R игнорирует запятую, если она идет в конце строки (например, тот, который появляется после 3 в приведенном ниже примере).Как получить пустые последние элементы из strsplit() в R?

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

Я бы хотел, чтобы оно было как: [1] "1" "2" "3" NA. Как я могу это сделать? Благодарю.

ответ

9

Вот несколько идей

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 

Эти оба возвращают целочисленные векторы. Вы можете обернуть as.character вокруг одного из них, чтобы получить точный результат вы показываете в Вопрос:

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

Или вы могли бы указать what="character" в scan или colClasses="character" в read.csv для слегка различной мощности

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

Вы также можете указать na.strings="" вместе с colClasses="character"

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

Хедли stringi (и ранее stringr) библиотеки огромное улучшение по базовой строковых функций (полностью векторизация, согласованная функция интерфейса):

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' является медленным, вы должны использовать 'stringi' :) –

+3

@silvaran, вы абсолютно правы, я только узнал о' stringi' после того, как написал это. (Как, на самом деле, оставаться на вершине самого последнего пакета в R?) – smci

3

Использование stringi пакета:

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" 
Смежные вопросы