【问题标题】:How to perform a for-loop for a variable in data.fame?如何为 data.fame 中的变量执行 for 循环?
【发布时间】:2017-02-17 16:04:04
【问题描述】:

我正在学习 R 中的 for loop。我试图弄清楚如何在data.frame 中的特定variable 中创建for loop。我查看了stackoverflow中的几个示例,例如Q1Q2Q3,但没有一个对我正在寻找的有用!

作为使用 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 非常感谢您的建设性建议!

标签: r for-loop dataframe


【解决方案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"
    }
}

【讨论】:

  • 一件小事:在帮助初学者时,尽量鼓励像for (i in seq_along(df$cyl) 这样的模式,而不是for (i in 1:length(df$cyl))
  • @joran,谢谢!
  • @d.b ,非常感谢您的解释! :)
猜你喜欢
  • 2014-07-18
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多