r - 如何使用 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 产品进行分类。
解决方案
我假设数据在数据框中,然后您可以检查 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"
推荐阅读
- javascript - 在 Typeahead.js 的远程属性(参数)中使用选择框值
- css - 如何使用切换按钮在同一行显示导航元素?
- mysql - SQL 跨两个不同的列捕获重复记录
- r - 使用 openair 和 hexbin 创建散点图矩阵
- python - 根据出现对数组元素进行分组,保持顺序,获取第一个和最后一个索引
- php - 解析 2 差异 Soap 响应 PHP
- c++ - 与 std::list 相比, push_back to std::vector 创建了许多临时对象
- c# - 使用 Raycasting 删除触摸时的 2D 对象?
- java - Gradle Recurring Module Not Found/Could not find or load main class error in Java 9+
- python - 使用 PyAudio 流式传输网络广播