用多个元素替换向量中的一个元素
Replace one element in vector with multiple elements
我有一个向量,我想用多个元素替换一个元素,我可以用一个元素替换,但不能用多个元素替换,有人能帮忙吗?
比如我有
data <- c('a', 'x', 'd')
> data
[1] "a" "x" "d"
我想用 "b", "c"
替换 "x"
以获得
[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
另一种方法:
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"
这是一个有点棘手的问题,因为在你的替换中你还想增加你的向量。话虽如此,我相信这应该有效:
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")
以下是我的处理方法:
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 的列表元素,然后取消列出结果以返回原子向量。
因为你想替换 "x" 的完全匹配,所以我不想在这种情况下使用 sub
/gsub
。
你可以试试这个,虽然我相信接受的答案很好:
unlist(strsplit(gsub("x", "b c", data), split = " "))
逻辑:将"x"替换为"b c"和space,然后进行strsplit,一旦拆分我们就可以再次转换回来使用 unlist 向量。
我有一个向量,我想用多个元素替换一个元素,我可以用一个元素替换,但不能用多个元素替换,有人能帮忙吗?
比如我有
data <- c('a', 'x', 'd')
> data
[1] "a" "x" "d"
我想用 "b", "c"
替换 "x"
以获得
[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
另一种方法:
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"
这是一个有点棘手的问题,因为在你的替换中你还想增加你的向量。话虽如此,我相信这应该有效:
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")
以下是我的处理方法:
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 的列表元素,然后取消列出结果以返回原子向量。
因为你想替换 "x" 的完全匹配,所以我不想在这种情况下使用 sub
/gsub
。
你可以试试这个,虽然我相信接受的答案很好:
unlist(strsplit(gsub("x", "b c", data), split = " "))
逻辑:将"x"替换为"b c"和space,然后进行strsplit,一旦拆分我们就可以再次转换回来使用 unlist 向量。