【发布时间】:2014-11-01 22:35:48
【问题描述】:
我需要处理一些主要是 csv 的数据。问题是如果逗号出现在行尾,R 会忽略逗号(例如,下例中 3 之后的那个)。
> strsplit("1,2,3,", ",")
[[1]]
[1] "1" "2" "3"
我希望它改为[1] "1" "2" "3" NA。我怎样才能做到这一点?谢谢。
【问题讨论】:
我需要处理一些主要是 csv 的数据。问题是如果逗号出现在行尾,R 会忽略逗号(例如,下例中 3 之后的那个)。
> strsplit("1,2,3,", ",")
[[1]]
[1] "1" "2" "3"
我希望它改为[1] "1" "2" "3" NA。我怎样才能做到这一点?谢谢。
【问题讨论】:
这里有几个想法
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
或者,您可以在scan 中指定what="character",或者在read.csv 中指定colClasses="character" 以获得略有不同的输出
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
【讨论】:
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
【讨论】:
stringr 很慢,你应该使用stringi :)
stringi。 (到底如何才能掌握 R 中的 which-latest-greatest-package?)
使用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"
【讨论】: