首页 > 解决方案 > 如何使用 for 循环转换列

问题描述

我正在尝试将亚马逊产品名称转换为特定类别并替换我数据框中的原始值。我该怎么做呢?

我已经有一个正则表达式代码和能够找到并打印转换的 for 循环,但是我无法替换列中的原始值。我还有一个似乎可以工作的嵌套 for 循环,但它只能正确转换和替换其中一个类别(Kindle)。我认为我的休息条件没有按我的意愿工作。

定义类别的代码:

fire = unique(grep('^[^Certified].*Fire TV', amz$name, value=TRUE))
kindle = unique(grep('^[^Certified]*Kindle', amz$name, value=TRUE))
echo = unique(grep('[^Certified].*Echo', amz$name, value=TRUE))
tap = unique(grep('[^Certified].*Tap', amz$name, value=TRUE))
tablet = unique(grep('^[^Certified].*Tablet', amz$name, value=TRUE))
refurb = unique(grep('^Certified', amz$name, value=TRUE))

转换和打印类别的代码:

for (x in amz$name){
        if(x %in% fire
        ){print('Fire TV')} else if(x %in% kindle
        ){print('Kindle')} else if(x %in% echo
        ){print('Echo')} else if(x %in% tap
        ){print('Tap')} else if(x %in% tablet
        ){print('Tablet')} else if(x %in% refurb
        ){print('Certified Refurbished')} else {
                                print('Misc')
                            }
                        }

尝试替换原始值的代码:

for (i in 1:nrow(amz)){
    for (x in amz$name[i]){
        if(x %in% fire
            ){(amz$name[i] <- 'Fire TV') 
                break} else if(x %in% kindle
            ){(amz$name[i] <- 'Kindle') 
                break} else if(x %in% echo
            ){(amz$name[i] <- 'Echo') 
                break} else if(x %in% tap
            ){(amz$name[i] <- 'Tap') 
                break} else if(x %in% tablet
            ){(amz$name[i] <- 'Tablet') 
                break} else if(x %in% refurb
            ){(amz$name[i] <- 'Certified Refurbished') 
                break} else {(amz$name[i] <- 'Misc') 
                    break
        }
    }
}

在内部循环中,我希望代码检查 x 是否在第一个列表中,如果不在,则移动到下一个列表,直到找到它所属的列表并在 amz$name[i] 中输入类别。一旦找到并输入,我希望内循环中断,外循环移动到第二次迭代,i=2。到目前为止,它只对第一个类别进行了正确处理,其余类别返回 NA。我应该说 amz$name[1] 的产品是 Kindle Paperwhite。所以它似乎是在选择性地对 Kindle 产品进行分类。

标签: rloopsfor-loopif-statementtransformation

解决方案


我假设数据在数据框中,然后您可以检查 ifelse 语句。

请注意,您必须使用多个 ifelse 语句,但它是矢量化的,并且与较大数据集的 for 循环相比运行速度更快。

ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))

以上是针对 3 种情况编写的,您可以针对更多情况进行相应调整... 下面的一个示例...

> x="alex"
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Alexa"
> x="mango"
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Misc"
> x=rbind("alex","mango")
> ifelse(x %in% 'fire', "Fire TV", ifelse(x %in% 'Kindle', "Kindle", ifelse(x %in% 'alex', "Alexa", "Misc")))
[1] "Alexa" "Misc" 

推荐阅读