我正在尝试将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产品进行分类。
答案 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.'
)))))))