如何在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,写,并以stringslow, 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 

解释任何帮助,不胜感激!

+3

无需循环:'mtcars $ NEWCOL Frank

+1

所以它通常倾向于尽可能地避免在R中出现循环。这就是为什么弗兰克斯回应和D.B.的答案的第一部分确实是更正确的解决方案。与其花时间使用循环,而循环速度较慢并最终变得复杂得多,可以考虑花时间学习数组函数,并对“应用”函数组感到满意。当涉及到代码的整洁和可读性以及它们可能执行给定操作的速度时,它们是FAR优越的。 – SeldomSeenSlim

+0

@AronBoettcher非常感谢建设性的建议! – Daniel

这个特殊的操作可能没有循环。

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" 
    } 
} 
+4

一件小事:在帮助初学者时,试着鼓励像'for(我在seq_along(df $ cyl)'而不是'for(我在1:length(df $ cyl))'' – joran

+0

@joran,谢谢! –

+1

@db,非常感谢!:) – Daniel