【问题标题】:Failing gsub in for loops在 for 循环中失败 gsub
【发布时间】:2020-06-09 20:13:14
【问题描述】:

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

我想使用循环,但 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】:

我们可以使用矢量化的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"   

留下最后一个即'red car' 'blue car', 'car'作为最终输出

似乎 OP 想要替换每个相应的行。在这种情况下,只需在 gsub 的“x”值和 &lt;- 的 lhs 上使用索引

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

更新

基于 OP 的更新帖子

auto$entry_simple <- auto$entry
for(i in 1:length(drop)) auto$entry_simple <- gsub(drop[i],"",auto$entry_simple)

【讨论】:

  • 不幸的是,代码因重复输入而崩溃。例如``` auto 的(长)列表
  • @MCS 你能用一个新的例子更新你的帖子吗?当前示例还暗示它正在对每一行进行替换,因为 'drop' 长度和 'entry' 的行数是相同的
  • 完成。我认为只需使用 for(i in seq_along(drop)) auto$entry 即可解决
【解决方案2】:

这行得通。这一切都归结为“seq_along”吗?

for(i in seq_along(drop)) auto$entry <- gsub(drop[i], "",auto$entry) 

【讨论】:

  • 不,与此无关。问题是您正在更新不同的列,而 gusb 是在不同的列上完成的。试试autor$entry_simple &lt;- auto$entry,然后在&lt;-两侧使用相同的更新
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多