0

可能重复:
R if 带有向量化语句

关于如何在此处最好地矢量化函数有一些类似的问题,但我还没有找到一个按行对数据框应用 if 类型函数的示例。

给出一个数据框 df,其中包含 1912 年至 2010 年的“年份”列,我只是想应用一个测试来判断给定年份是在测试年份之前还是之后(例如 1948 年)并分配一个字符“是”或“否”在另一列中。应该很容易...

目前,我编写的代码如下:

i = 1
while (i < nrow(df)) {
     if (df$Year[i] < 1948) {
         df$Test[i] <- "Yes"        
     } else { df$Test[i] <- "No"
     }
     i = i + 1
 }

上面的方法有效,但是对于大型数据集来说很慢,而且我知道在 R 中必须有一个更“优雅”的解决方案。是否可以使用更好的方法?还是有更简单的东西?

谢谢!

4

2 回答 2

4

ifelse在这里更有意义。

df$Test <- ifelse(df$Year < 1948, "Yes", "No")

ifelse是 if/else 构造的矢量化版本。使用 R 时,如果可能,使用矢量化解决方案几乎总是更有意义。

于 2012-10-31T15:36:28.397 回答
3

ifelse()相反,您希望它是矢量化returns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSE的,并且,或者说帮助页面。

例如:

> years <- 1980:2000

> ifelse(years < 1986, "old", "young")
 [1] "old"   "old"   "old"   "old"   "old"   "old"   "young" "young" "young" "young" "young" "young" "young" "young" "young"
[16] "young" "young" "young" "young" "young" "young"

如果你有两个以上的条件,你甚至可以嵌套ifelse()语句,如果你熟悉的话,类似于 Excel=IF()

ifelse(years < 1986, "old", ifelse(years < 1996, "medium", "young"))
于 2012-10-31T15:37:43.100 回答