Как получить пустые последние элементы из strsplit() в R?

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

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

Я бы хотел, чтобы вместо этого он читался как [1] "1" "2" "3" NA. Как я могу это сделать? Спасибо.


person ceiling cat    schedule 01.11.2014    source источник


Ответы (3)


Вот пара идей

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 
person GSee    schedule 01.11.2014

Библиотеки Hadley 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
person smci    schedule 01.11.2014
comment
stringr работает медленно, вам следует использовать stringi :) - person ; 21.04.2015
comment
@silvaran, вы совершенно правы, я узнал об stringi только после того, как написал это. (Как, черт возьми, оставаться в курсе того, какой самый последний лучший пакет в R?) - person smci; 21.04.2015

Использование пакета 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"
person bartektartanus    schedule 21.04.2015