拆分字符串中的第一个逗号
Posted
技术标签:
【中文标题】拆分字符串中的第一个逗号【英文标题】:Split on first comma in string 【发布时间】:2012-04-25 03:51:03 【问题描述】:如何使用 base 有效地将以下字符串拆分为第一个逗号?
x <- "I want to split here, though I don't want to split elsewhere, even here."
strsplit(x, ???)
期望的结果(2 个字符串):
[[1]]
[1] "I want to split here" "though I don't want to split elsewhere, even here."
提前谢谢你。
编辑:没想到要提这个。这需要能够泛化到一列,这样的字符串向量,如:
y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.")
结果可以是两列或一个长向量(我可以获取其他所有元素)或每个索引 ([[n]]) 有两个字符串的字符串列表。
对不够清晰表示歉意。
【问题讨论】:
非常hacky,但是像list(head(y[[1]],1), paste(tail(y[[1]],-1), collapse = ","))
这样y
是strsplit(x, ...)
的输出呢?
Chase 我试过了,但似乎无法让它适用于类似字符串的向量。我编辑了我的原始帖子以进一步解释问题。
str_locate_all(string=y, ',')
将找到您的模式的所有索引位置(在您的情况下为逗号),然后可以将其应用于从向量或列中进行选择。
【参考方案1】:
这就是我可能会做的事情。它可能看起来很 hacky,但由于 sub()
和 strsplit()
都是矢量化的,因此在处理多个字符串时它也可以顺利工作。
XX <- "SoMeThInGrIdIcUlOuS"
strsplit(sub(",\\s*", XX, x), XX)
# [[1]]
# [1] "I want to split here"
# [2] "though I don't want to split elsewhere, even here."
【讨论】:
@josh-obrien 您将如何扩展该代码以修剪 [2] 中的前导空格。 我会用gsub("^\\s+|\\s+$", "", JOSH's STUFF)
包装它
我喜欢乔希。它可以工作并且非常简单并且保持在基础上。谢谢你。 +1
您可以使用any(grepl(XX,x))
检查您的XX
是否正常。如果是FALSE
就可以了。
@established1969 -- 要修剪逗号后面的空格,我会改为使用strsplit(sub(",\\s*", XX, x), XX)
。【参考方案2】:
来自stringr
包:
str_split_fixed(x, pattern = ', ', n = 2)
# [,1]
# [1,] "I want to split here"
# [,2]
# [1,] "though I don't want to split elsewhere, even here."
(这是一个一行两列的矩阵。)
【讨论】:
【参考方案3】:这是另一种解决方案,使用正则表达式来捕获第一个逗号之前和之后的内容。
x <- "I want to split here, though I don't want to split elsewhere, even here."
library(stringr)
str_match(x, "^(.*?),\\s*(.*)")[,-1]
# [1] "I want to split here"
# [2] "though I don't want to split elsewhere, even here."
【讨论】:
【参考方案4】:library(stringr)
str_sub(x,end = min(str_locate(string=x, ',')-1))
这将得到你想要的第一个位。更改str_sub
中的start=
和end=
以获得您想要的任何其他内容。
如:
str_sub(x,start = min(str_locate(string=x, ',')+1 ))
并用str_trim
换行以去掉前导空格:
str_trim(str_sub(x,start = min(str_locate(string=x, ',')+1 )))
【讨论】:
【参考方案5】:这可行,但我更喜欢 Josh Obrien:
y <- strsplit(x, ",")
sapply(y, function(x) data.frame(x= x[1],
z=paste(x[-1], collapse=",")), simplify=F))
受到追逐的回应的启发。
许多人给出了非基本方法,所以我想我会添加我通常使用的方法(尽管在这种情况下我需要一个基本响应):
y <- c("Here's comma 1, and 2, see?", "Here's 2nd sting, like it, not a lot.")
library(reshape2)
colsplit(y, ",", c("x","z"))
【讨论】:
在您的第一部分中,我不明白为什么您会在 seq_along(y) 上使用 sapply 而不仅仅是 y。您看起来并不真正需要明确的索引。即使您希望将它们保留在其他字符串中,您似乎也删除了所有逗号?以上是关于拆分字符串中的第一个逗号的主要内容,如果未能解决你的问题,请参考以下文章