【问题标题】:For Loop with If/Else to create a new column in a df使用 If/Else 循环在 df 中创建新列
【发布时间】:2022-01-02 09:38:13
【问题描述】:

我是一名尝试学习 R 的学生……我花了好几个小时试图弄清楚这一点,但到目前为止都失败了。也许我的方法不对,或者不知道一些基本的东西。

我有包含学生编号和模块结果的数据 - 结果是数字形式,我想将结果更改为等级 - A、B、C 等。我设法创建了一个循环来打印评分,但不知道如何将其放入数据框中。

我拥有的数据集很大,所以我为下面的示例创建了一些虚拟数据,代码运行,并没有给我任何错误,但它没有用字母等级替换数字:

`Result <- c(50,67,89,77,65,66,70,73,69,80)

    for (i in Result){
if (i < 16.67) {
print ("G+")
i <- "G+"
} else if (i < 26.67) {
print ("F+")
 i <- "F+"
} else if (i < 36.67) {
print ("E+")
i <- "E+"
} else if (i < 40) {
print ("D-")
i <- "D+"
}else if (i < 43.33) {
 print ("D")
 i <- "D"
}else if (i < 46.67) {
print ("D+")
i <- "D+" 
}else if (i < 50) {
print ("C-")
i <- "C-"
}else if (i < 53.33) {
print ("D")
i <- "D"
}else if (i < 56.67) {
print ("D+")
i <- "D+"
}else if (i < 60) {
print ("B-")
i <- "B-"
}else if (i < 63.33) {
print ("B")
i <- "B"
}else if (i < 66.67) {
print ("B+")
i <- "B+"
}else if (i < 70) {
print ("A-")
i <- "A-"
}else if (i < 73.33) {
print ("A")
i <- "A"
}else if (i < 100) {
print ("A+")
i <- "A+"
}
}

# result: [1] "D"
[1] "A-"
[1] "A+"
[1] "A+"
[1] "B+"
[1] "B+"
[1] "A"
[1] "A"
[1] "A-"
[1] "A+"`   `


    

任何建议将不胜感激。 非常感谢, 埃尔。

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    将您的示例数据放入 data.frame:

    df <- data.frame( result = c(50,67,89,77,65,66,70,73,69,80) )
    

    然后使用cut() 在该data.frame 的新列中获取成绩:

    df$grade <- cut(df$result, 
                breaks = c(0, 16.67, 26.67, 36.67, 40, 43.33, 46.67, 50, 53.33, 56.67, 60, 63.33, 66.67, 70, 73.33, 100), 
                labels = c("G+", "F+", "E+", "D-", "D", "D+", "C-", "C", "C+", "B-", "B", "B+", "A-", "A", "A+"))
    

    打印结果进行检查:

    df
    
       result grade
    1      50    C-
    2      67    A-
    3      89    A+
    4      77    A+
    5      65    B+
    6      66    B+
    7      70    A-
    8      73     A
    9      69    A-
    10     80    A+
    

    请注意 (1) 将结果保存到 data.frame 比简单地打印它们更好,并且 (2) 如果您不循环,许多事情可以在 R 中做得更好/更快;而是使用 R 的矢量化函数(如 cut!)。

    【讨论】:

    • 嗨,DanY,我刚刚尝试过,它实现了梦想!太感谢了!我以前从未见过 cut() - 我想我还有很多东西要学 :-) 再次感谢,祝你有个愉快的夜晚。
    • 不客气。这里有很多很好的免费资源可帮助您学习:bigbookofr.com/index.html
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2020-09-10
    • 2022-01-08
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多