如何使用for循环转换列

时间:2019-04-17 20:38:39

标签: r loops for-loop if-statement transformation

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

我已经有一个正则表达式代码和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 = 2。到目前为止,只有第一个类别才正确,其余类别返回NA。我应该说amz $ name [1]处的产品是Kindle Paperwhite。因此,它似乎是有选择地对Kindle产品进行分类。

2 个答案:

答案 0 :(得分:0)

我假设数据在数据框中,那么您可以检查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" 

答案 1 :(得分:0)

感谢@divibisan和@FlyingPickle!同时使用mutate和ifelse,我可以找到解决问题的方法。

amz <- mutate(amz, newCat = 
    ifelse(name %in% fire,
    'Amazon Fire TV', 
            ifelse(name %in% kindle,
            'Amazon Kindle',
                ifelse(name %in% echo,
                'Amazon Echo',
                    ifelse(name %in% tap,
                    'Amazon Tap',
                        ifelse(name %in% tablet,
                        'Amazon Tablet',
                            ifelse(name %in% refurb,
                            'Certified Refurbished',
                            'Misc.'

                )))))))