我需要用一个公共字符分割一串字符串,但是我需要保留此分割的前缀并将其粘贴到新的分割字符串中。这是矢量数据中前两个字符串的示例(有很多)。
示例:
dat <- c("Dry Lake I & II", "Blue Moon 1 & 2", "Hardscrabble 2012 & 2013)
"Dry Lake I & II"
"Blue Moon 1 & 2"
需要成为:
"Dry Lake I"
"Dry Lake II"
"Blue Moon 1"
"Blue Moon 2"
我可以和strsplit
分手,但是我不知道如何完成第二部分。
strsplit(dat, "&")
给我:
[[1]]
[1] "Dry Lake I " " II"
[[2]]
[1] "Blue Moon 1 " " 2"
有什么想法吗?
答案 0 :(得分:2)
我们可以使用sub
将“ " & "
”替换为“ Dry Lake”,然后使用scan
将字符串分成两个
scan(text = sub(" & ", ",Dry Lake", str1, fixed = TRUE), sep=",",
what = "", quiet = TRUE)
#[1] "Dry Lake I" "Dry LakeII"
使用更新的数据
scan(text = sub("^([A-Za-z ]+) ([I1]) \\&", "\\1 \\2,\\1", dat),
sep=",", what = "", quiet = TRUE)
#[1] "Dry Lake I" "Dry Lake II" "Blue Moon 1" "Blue Moon 2"
str1 <- "Dry Lake I & II"
答案 1 :(得分:2)
这是一个可能满足您需求的版本:
x <- "Dry Lake I & II"
x <- sub("(.*) I & II", "\\1 I & \\1 II", x)
strsplit(x, "\\s+&\\s+")[[1]]
[1] "Dry Lake I" "Dry Lake II"
这里的逻辑是将<some content> I & II
转换为:
<some content> I & <some content> II
然后,我们在定界符&
上分割以生成字符向量。这里的一个缺陷是,如果&
可以作为名称的一部分出现,则该方法可能行不通。
答案 2 :(得分:1)
匹配输入的三个部分,将它们放置在新字符串中,重复第一部分,并在它们之间使用换行符。然后阅读在换行符处有效拆分的内容。
readLines(textConnection(sub("(.*) (\\S+) & (\\S+)", "\\1 \\2\n\\1 \\3", dat)))
## [1] "Dry Lake I" "Dry Lake II" "Blue Moon 1" "Blue Moon 2"