【发布时间】:2017-02-17 16:04:04
【问题描述】:
我正在学习 R 中的 for loop。我试图弄清楚如何在data.frame 中的特定variable 中创建for loop。我查看了stackoverflow中的几个示例,例如Q1、Q2、Q3,但没有一个对我正在寻找的有用!
作为使用 mtcars 数据集的示例,假设我想执行 for loop 到:
查看cyl 并分别定义cyl 4,6,8, 写入并替换为strings (low, medium, high)。
for (i in mtcars$cyl) {
if (mtcars$cyl == 4){
print("low")}
if (mtcars$cyl == 6) {
print ("medium")}
if (mtcars$cyl == 8) {
print ("high")}
}
当然不是这样的!
预期是这样的:
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
转换为:
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 medium 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 medium 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 low 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 medium 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 high 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 medium 225 105 2.76 3.460 20.22 1 0 3 1
非常感谢您对解释的任何帮助!
【问题讨论】:
-
无需循环:
mtcars$newcol <- factor(mtcars$cyl, labels = c("low", "medium", "high"))详见?factor。 -
因此,通常首选在 R 中尽可能避免循环。这就是为什么 Franks 的响应和 DB 的答案的第一部分确实是更正确的解决方案。与其花时间在更慢且最终变得更加复杂的循环上,不如考虑花时间学习数组函数并熟悉“应用”函数组。它们在代码的简洁性和可读性以及它们执行给定操作的速度方面都非常出色。
-
@AronBoettcher 非常感谢您的建设性建议!