我有一个向量,我想用多个元素替换一个元素,我可以用一个而不是多个元素替换,任何人都可以帮忙吗?
例如我有
data <- c('a', 'x', 'd')
> data
[1] "a" "x" "d"
我想将"x"
替换为"b", "c"
以获取
[1] "a" "b" "c" "d"
然而
gsub('x', c('b', 'c'), data)
给了我
[1] "a" "b" "d"
Warning message:
In gsub("x", c("b", "c"), data) :
argument 'replacement' has length > 1 and only the first element will
be used
答案 0 :(得分:4)
以下是我将如何处理它:
data <- c('a', 'x', 'd')
lst <- as.list(data)
unlist(lapply(lst, function(x) if(x == "x") c("b", "c") else x))
# [1] "a" "b" "c" "d"
我们正在利用列表结构比原子向量更灵活的事实。我们可以用长度为> 1的元素替换长度为1的list-element,然后将结果取消列表以返回原子向量。
由于您要替换“x”的完全匹配,我不想在这种情况下使用sub
/ gsub
。
答案 1 :(得分:2)
你可以试试这个,虽然我相信接受的答案很棒:
unlist(strsplit(gsub("x", "b c", data), split = " "))
逻辑:替换&#34; x&#34;用&#34; b c&#34;有空间然后做strsplit,一旦它分裂我们可以转换为使用unlist再次回到矢量。
答案 2 :(得分:1)
这对于一个问题来说有点棘手,因为在你的替换中你也想要增长你的向量。话虽如此,我相信这应该有用:
replacement <- c("b","c")
new_data <- rep(data, times = ifelse(data=="x", length(replacement), 1))
new_data[new_data=="x"] <- replacement
new_data
#[1] "a" "b" "c" "d"
如果您的向量中有多个"x"
,例如:
data <- c("a","x","d","x")
答案 3 :(得分:0)
另一种方法:
data <- c('a', 'x', 'd')
pattern <- "x"
replacement <- c("b", "c")
sub_one_for_many <- function(pattern, replacement, x) {
removal_index <- which(x == pattern)
if (removal_index > 1) {
result <- c(x[1:(removal_index-1)], replacement, x[(removal_index+1):length(x)])
} else if (removal_index == 1) {
result <- c(replacement, x[2:length(x)])
}
return(result)
}
answer <- sub_one_for_many(pattern, replacement, data)
输出:
> answer
[1] "a" "b" "c" "d"