在R中的不同索引处拆分字符串

时间:2015-10-19 23:16:11

标签: r string

我有一个不同索引的字符串,其中有空格后跟数字。我想使用这些索引在它们之间拆分字符串。

例如我有一个向量

"               4 1   138  138  138  138  140  140  140  140  140  141  142  144  144  145  145  146  145  145  145  145  145  139  135  133   3391"

并希望将其拆分为

[1]"4" "1 " "138" "138" "138" "138" "140" "140" "140" "140" "140" "141" "142" "144" 
[15]"144" "145" "145" "146" "145" "145" "145" "145" "145" "139" "135" "133 ""3391"

我使用了grepexpr(“[1-9]”,数据)并获得了

[[1]]
 [1]  15  17  21  26  31  36  41  46  51  56  61  66  71  76  81  86
 [17]  91  96 101 106 111 116 121 126 131 136 142
attr(,"match.length")
 [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
attr(,"useBytes")
 [1] TRUE

我试过使用strsplit和substr但到目前为止还没有任何工作。 使用substr时出现整数错误,然后strsplit返回相同的字符串。

2 个答案:

答案 0 :(得分:4)

评论中提到您可以使用strsplit()。另一个在此字符串上运行良好的选项是scan()

x <- "               4 1   138  138  138  138  140  140  140  140  140  141  142  144  144  145  145  146  145  145  145  145  145  139  135  133   3391"
scan(text = x, what = "")
# Read 27 items
#  [1] "4"    "1"    "138"  "138"  "138"  "138"  "140"  "140"  "140"  "140" 
# [11] "140"  "141"  "142"  "144"  "144"  "145"  "145"  "146"  "145"  "145" 
# [21] "145"  "145"  "145"  "139"  "135"  "133"  "3391"

以上为我们提供了字符结果,如您所示,您的问题需要。我们也可以通过省略what参数或将其更改为integer()(取决于输入)来返回数值结果。

scan(text = x)
# Read 27 items
#  [1]    4    1  138  138  138  138  140  140  140  140  140  141  142  144
# [15]  144  145  145  146  145  145  145  145  145  139  135  133 3391

您可以使用Read 27 items忽略quiet = TRUE消息。

在这里使用scan()的一个好处是,你不会像在使用strsplit()时那样在结果的开头获得一个空字符串。

strsplit(x, "\\s+")[[1]][1:3]
# [1] ""  "4" "1"

答案 1 :(得分:1)

可能有点矫枉过正,但我​​喜欢strapplyc

中的gsubfn

对于您的问题,您可以

strapplyc(x, " ([0-9]+)", simplify = T)

与apply系列类似,但在括号中查找正则表达式并仅提取()所包含的位。