如何在data.fame中为变量执行for-loop?
问题描述:
我在R
学习for loop
。我试图找出如何在data.frame
的特定variable
中制作for loop
。我看了几个例子在计算器中,例如Q1,Q2,Q3,但没有一个对我所寻找的是有用的!如何在data.fame中为变量执行for-loop?
作为使用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
与解释任何帮助,不胜感激!
答
这个特殊的操作可能没有循环。
df = mtcars
df$cyl[df$cyl == 4] = "low" #Subset the cyl values equal to 4 and assign 'low'
#Repeat for other values
但对于运行循环,我会去这样
df = mtcars
for (i in 1:length(df$cyl)) { #Iterate over the length of df$cyl
#You could also do "for (i in seq_along(df$cyl)"
#Run "seq_along(df$cyl)" and "1:length(df$cyl)" to understand what values are being generated
if (df$cyl[i] == 4){ #Index df$cyl by [i]. If the ith value is 4, assign 'low'
df$cyl[i] = "low"
}
if (df$cyl[i] == 6) {
df$cyl[i] = "medium"
}
if (df$cyl[i] == 8) {
df$cyl[i] = "high"
}
}
无需循环:'mtcars $ NEWCOL Frank
所以它通常倾向于尽可能地避免在R中出现循环。这就是为什么弗兰克斯回应和D.B.的答案的第一部分确实是更正确的解决方案。与其花时间使用循环,而循环速度较慢并最终变得复杂得多,可以考虑花时间学习数组函数,并对“应用”函数组感到满意。当涉及到代码的整洁和可读性以及它们可能执行给定操作的速度时,它们是FAR优越的。 – SeldomSeenSlim
@AronBoettcher非常感谢建设性的建议! – Daniel