如何为data.fame中的变量执行for循环?
我正在学习如何为data.fame中的变量执行for循环?,r,for-loop,dataframe,R,For Loop,Dataframe,我正在学习R中的for循环。我试图找出如何在data.frame中的特定变量中创建for循环。我研究了stackoverflow中的几个示例,例如,但没有一个对我所寻找的有用 作为使用mtcars数据集的示例,假设我要执行for循环: 查看cyl并定义cyl 4,6,8,写入并替换为字符串(低、中、高) for (i in mtcars$cyl) { if (mtcars$cyl == 4){ print("low")} if (mtcars$cyl == 6) {
R
中的for循环
。我试图找出如何在data.frame中的特定变量中创建for循环。我研究了stackoverflow中的几个示例,例如,但没有一个对我所寻找的有用
作为使用mtcars
数据集的示例,假设我要执行for循环
:
查看cyl
并定义cyl 4,6,8,
写入并替换为字符串(低、中、高
)
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
转换为:
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"
}
}
这种特殊的操作在没有循环的情况下是可能的
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"
}
}
一件小事:在帮助初学者时,尽量鼓励使用for(i in seq_-along(df$cyl)
而不是for(i in 1:length(df$cyl))
@joran,谢谢!@d.b,非常感谢你的解释!:)一件小事:在帮助初学者时,尽量鼓励使用for(i in seq_-along(df$cyl)
而不是for(i in 1:length(df$cyl))
@joran,谢谢!@d.b,非常感谢您的解释!:)不需要循环:mtcars$newcol,因此通常倾向于尽可能避免R中的循环。这就是为什么Franks响应和d.b答案的第一部分确实是更正确的解决方案。与其花时间在那些速度较慢、结果更复杂的循环上,不如考虑花点时间学习数组函数,并习惯于“应用”函数组。当涉及到代码的整洁性和可读性,以及执行给定操作的速度时,它们都是非常优秀的。@AronBoettcher非常感谢您的建设性建议!不需要循环:mtcars$newcol,因此通常倾向于在R中尽可能避免循环。这就是为什么Franks的回答和D.B.答案的第一部分实际上是更正确的解决方案。与其花时间在那些速度较慢、结果更复杂的循环上,不如考虑花点时间学习数组函数,并习惯于“应用”函数组。当涉及到代码的整洁性和可读性,以及执行给定操作的速度时,它们都是非常优秀的。@AronBoettcher非常感谢您的建设性建议!