我是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
电话的输出?我猜我的符号区分分隔符+空格是错误的。对此的任何帮助都会很好。
答案 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"