我对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
调用获得输出?我猜我用来区分分隔符+空白的符号是错误的。这方面的任何帮助都是好的。
我差点错过的另一个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"
按要求分解:
[| ]+
是搜索空间的单个或重复实例+
的正则表达式nbsp;或管道
[^| ]+
+
是一个正则表达式,用于搜索任何字符的单个或重复实例^
,而不是|
空格nbsp;或管道
regmatches
CCD_ 15查找该模式的所有实例,并返回匹配模式的起始位置和长度
CCD_ 16从CCD_ 17中提取CCD_ 18 匹配的所有模式
这里有一种方法。这首先从具有scan
的向量中移除strsplit
。然后它在空间(或任意数量的空间)上使用CCD_21。这样可能容易一点。
strsplit(gsub("|", "", sampleVector, fixed=TRUE), "\s+")
# [[1]]
# [1] "" "txt01" "100" "200" "123.456" "0.12345"
#
# [[2]]
# [1] "" "txt02" "300" "400" "789.012" "0.06789"
这里有一个使用CCD_22的有趣的替代方案,它可能很有用,而且可能很快。
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"
可以先尝试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"