我需要處理一些主要是csv的數據。問題在於如果R在行尾(例如,下面示例中的3之後的那個行)結束時忽略逗號。如何從R中的strsplit()獲得空的最後一個元素?
> strsplit("1,2,3,", ",")
[[1]]
[1] "1" "2" "3"
我想將它作爲[1] "1" "2" "3" NA
來代替。我怎樣才能做到這一點?謝謝。
我需要處理一些主要是csv的數據。問題在於如果R在行尾(例如,下面示例中的3之後的那個行)結束時忽略逗號。如何從R中的strsplit()獲得空的最後一個元素?
> 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
或者,你可以在read.csv
指定scan
what="character"
,或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
哈德利的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
使用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"
'stringr'是緩慢的,你應該使用'stringi' :) – 2015-04-21 00:52:34
@silvaran你是完全正確的,我在寫完這些之後才意識到'stringi'。 (如何在R上保持最新的最佳包裝?) – smci 2015-04-21 01:01:04