循环中的gsub失败

问题描述 投票:0回答:1

我需要从一个向量中删除一系列子串,这些子串可能会出现,也可能不会出现多次。要删除的子串数量少于字符串的数量。

我想使用一个循环,但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
r gsub stringr
1个回答
2
投票

我们可以用 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)

0
投票

这样就可以了。都是 "seq_along "的问题吗?

for(i in seq_along(drop)) auto$entry <- gsub(drop[i], "",auto$entry) 
© www.soinside.com 2019 - 2024. All rights reserved.