1

让我们定义以下字符串s

s <- "$ A; B; C;"

我需要翻译s成:

"$ A; $B; $C;"

分号是分隔符。但是,$ 只是可以出现在字符串中的 3 个特殊字符之一。数据框m包含所有 3 个特殊字符:

m <- data.frame(sp = c("$", "%", "&"))

我第一次使用strsplit分号作为分隔符来分割字符串

> strsplit(s, ";")
[[1]]
[1] "$ A" " B"  " C" 

我认为下一步是使用 grep 或 match 来检查第一个字符串是否包含 data frame 中定义的 3 个特殊字符中的任何一个m。如果是这样,可以使用 gsub 将匹配的特殊字符插入剩余的子字符串中。然后简单地使用 paste with collapse = "" 再次将子字符串合并在一起。那有意义吗?

干杯

4

3 回答 3

1

像这样的东西怎么样:

getmeout = gsub("[$|%|& ]", "", unlist(strsplit(s, ";")))
whatspecial = unique(gsub("[^$|%|&]", "", s))
whatspecial
# [1] "$"
getmeout
# [1] "A" "B" "C"
paste0(whatspecial, getmeout, sep=";", collapse="")
# [1] "$A;$B;$C;"
于 2012-07-18T10:31:40.173 回答
1

这是一种方法:

library(stringr)
separator <- '; '

# extract the first part
first.part <- str_split(s, separator)[[1]][1]
first.part
# [1] "$ A"

# try to identify your special character
special <- m$sp[str_detect(first.part, as.character(m$sp))]
special
# [1] $
# Levels: $ & %

# make sure you only matched one of them
stopifnot(length(special) == 1)

# search and replace
gsub(separator, paste(separator, special, sep=""), s)
# [1] "$ A; $B; $C;"

如果我错过了你的一些假设,请告诉我。

于 2012-07-18T10:37:51.013 回答
1

反向引用将其变成单行:

s <- c( "$ A; B; C;", "& A; B; C;", "% A; B; C;" )
ms = c("$", "%", "&")

s <- gsub( paste0("([", paste(ms,collapse="") ,"]) ([A-Z]); ([A-Z]); ([A-Z]);") , "\\1 \\2; \\1 \\3; \\1 \\4" , s) 

> s
[1] "$ A; $ B; $ C" "& A; & B; & C" "% A; % B; % C"

然后,如果需要,您可以使正则表达式适当地通用(匹配多个空格、多个字母数字字符等)。

于 2012-07-18T10:44:45.823 回答