R:删除空格+分隔符

时间:2014-10-21 01:17:56

标签: r delimiter strsplit

我是R语言的新手。所以我有这个包含以下内容的向量:

> head(sampleVector)

[1] "| txt01 |   100 |         200 |       123.456 |           0.12345 |"
[2] "| txt02 |   300 |         400 |       789.012 |           0.06789 |"

我想提取线条并将每个线条分成不同的部分,每个部分都有一个数据值。 我想得到一个列表resultList,最终将打印出以下内容:

> head(resultList)`

[[1]]`  
[1] ""   "txt01"    "100"       "200"     "123.456"        "0.12345" 

[[2]]`  
[1] ""   "txt02"    "300"       "400"     "789.012"        "0.06789"

我正在努力使用strsplit()符号,到目前为止我已经尝试并获得了以下代码:

resultList  <- strsplit(sampleVector,"\\s+[|] | [|]\\s+ | [\\s+]")`          
#would give me the following output`

# [[1]]`    
# [1] "| txt01"    "100"       "200"     "123.456"        "0.12345 |" 

无论如何,我可以得到一个strsplit电话的输出?我猜我的符号区分分隔符+空格是错误的。对此的任何帮助都会很好。

3 个答案:

答案 0 :(得分:4)

这是一种方式。这首先使用|从向量中删除gsub。然后它在空格(或任意数量的空格)上使用strsplit。这样可能有点容易。

strsplit(gsub("|", "", sampleVector, fixed=TRUE), "\\s+")
# [[1]]
# [1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
#
# [[2]]
# [1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"

这是使用scan的一个有趣的替代方案,它可能很有用,并且可能会非常快。

lapply(sampleVector, function(y) {
    s <- scan(text = y, what = character(), sep = "|", quiet = TRUE)
    (g <- gsub("\\s+", "", s))[-length(g)]
})
# [[1]]
# [1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
#
# [[2]]
# [1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"

答案 1 :(得分:4)

我差点错过的另一个strsplit选项:

strsplit(test,"[| ]+")
#[[1]]
#[1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
# 
#[[2]]
#[1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"

...和我最初的回答是因为regmatches是我最近最喜欢的功能:

regmatches(test,gregexpr("[^| ]+",test))
#[[1]]
#[1] "txt01"   "100"     "200"     "123.456" "0.12345"
#
#[[2]]
#[1] "txt02"   "300"     "400"     "789.012" "0.06789"

按要求分解:

[| ]+是一个正则表达式,用于搜索空格+或管道的单个或重复实例| [^| ]+是一个正则表达式,用于搜索任何字符+空格^或管道的单个或重复实例| gregexpr找到此模式的所有实例,并返回匹配模式的起始位置和长度 regmatches提取test

匹配的gregexpr中的所有模式

答案 2 :(得分:0)

首先尝试strsplit和gsub:

sapply(strsplit(xx, '\\|'), function (x) gsub("^\\s+|\\s+$", "", x))
     [,1]     
[1,] ""       
[2,] "txt01"  
[3,] "100"    
[4,] "200"    
[5,] "123.456"
[6,] "0.12345"