我需要从一个向量中删除一系列子串,这些子串可能会出现,也可能不会出现多次。要删除的子串数量少于字符串的数量。
我想使用一个循环,但gsub似乎在for循环中失败了。
drop <- c("red ","blue ","yellow ")
auto <- data.frame(entry=c("red car","red yellow car","car"))
for(i in 1:length(drop)){
auto$entry_simple <- gsub(drop[i],"",auto$entry)
}
循环只对最后一个条目起作用,怎么会这样?
entry entry_simple
1 red car red car
2 red yellow car red car
3 car car
而不是
entry entry_simple
1 red car car
2 red yellow car car
3 car car
我们可以用 str_remove
矢量化
library(dplyr)
library(stringr)
auto %>%
mutate(entry_simple = str_remove(entry, drop))
# entry entry_simple
#1 red car car
#2 blue car car
#3 yellow car car
如果我们看这个循环,那么 gsub
是对整个列'entry'进行的,输出被分配给'entry_simple',即在每次迭代中,'entry_simple'都会发生变化。
lapply(drop, function(x) gsub(x, "", auto$entry))
#[[1]]
#[1] "car" "blue car" "yellow car"
#[[2]]
#[1] "red car" "car" "yellow car"
#[[3]]
#[1] "red car" "blue car" "car"
留下最后一个,即'红车''蓝车''车',作为最后的输出。
看来OP想要替换每一个对应的行。 在这种情况下,只需使用'x'值的索引来替换为 gsub
和在 <-
auto$entry_simple <- auto$entry
for(i in seq_along(drop)) auto$entry_simple[i] <- gsub(drop[i], "", auto$entry[i])
auto
# entry entry_simple
#1 red car car
#2 blue car car
#3 yellow car car
根据上级的最新帖子
auto$entry_simple <- auto$entry
for(i in 1:length(drop)) auto$entry_simple <- gsub(drop[i],"",auto$entry_simple)
这样就可以了。都是 "seq_along "的问题吗?
for(i in seq_along(drop)) auto$entry <- gsub(drop[i], "",auto$entry)