For循环和gsub R

For loop and gsub R

我有一个关于在 R 中的 for 循环中使用 gsub 的问题。

我有一个包含 "sku" 和 "cat" 列的数据框 (catalog),它们是同一产品的 sku ID 和目录 ID不同的来源。

然后我有一个带有 sku 的数据框 (image_data) 和图像描述 (image_data)。

我想创建一个新列(new_image_description),其中 sku 的所有实例都替换为列中相应的目录号(见下文)image_des.

但是只替换了一些,其他的没有。 下面是一些虚拟数据。

    catalog <- data.frame(sku = c('AX1', "BX2", "CX2", "DXX"), 
    cat = c("AL1", "AL2", "AL3", "AL4"))


    image_data <- data.frame(sku = c("CX2", "AX1", "BX2"), 
image_des = c("CX2 is a good product", "AX1 is not bad",  "BX2 is great as well as DXX"))

    image_data$new_image_description <- NA

    for (i in 1:nrow(catalog)) {

      image_data$new_image_description <-  gsub(as.character(catalog$sku[i]), as.character(catalog$cat[i]), image_data$image_des)

    }

如果能解释为什么它不能替代 sku,我将不胜感激。

如果我单独做,它会起作用。

最好的

您可以使用 qdap::mgsub 执行多个搜索和替换操作:

Multiple Gsub
A wrapper for gsub that takes a vector of search terms and a vector or single value of replacements.

查看 R 演示:

> library(qdap)
> image_data$new_image_description <- mgsub(as.character(catalog$sku), as.character(catalog$cat), image_data$image_des)
> image_data
  sku                   image_des       new_image_description
1 CX2       CX2 is a good product       AL3 is a good product
2 AX1              AX1 is not bad              AL1 is not bad
3 BX2 BX2 is great as well as DXX AL2 is great as well as AL4

无需加载任何库的解决方案。你需要一个嵌套循环。

  sku                   image_des                     new_des
1 CX2       CX2 is a good product       AL3 is a good product
2 AX1              AX1 is not bad              AL1 is not bad
3 BX2 BX2 is great as well as DXX AL2 is great as well as AL4

代码

for (i in 1:nrow(image_data)) {
    for (j in 1:nrow(catalog)) {
        image_data$new_des[i] <-  gsub(catalog$sku[j],
                                       catalog$cat[j],
                                       image_data$new_des[i])
    }
}

数据

image_data <- data.frame(sku = c("CX2", "AX1", "BX2"),
                         image_des = c("CX2 is a good product",
                                       "AX1 is not bad", 
                                       "BX2 is great as well as DXX"),
                         stringsAsFactors = FALSE)
image_data$new_des <- image_data$image_des