通过R中的数据帧行优化“if”函数

时间:2012-10-31 15:34:07

标签: r

  

可能重复:
  R if with vectorized statements

这里有一些关于如何最好地矢量化函数的类似问题,但我还没有找到一个应用if-type函数的例子,按行表示数据框。

给出一个数据框df,其中包含“Year”列,其中包含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中必须有一个更“优雅”的解决方案。使用更好的方法吗?或者有更简单的东西吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

ifelse在这里更有意义。

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

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

答案 1 :(得分: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"

如果您有2个以上的条件,您甚至可以嵌套ifelse()语句,如果您熟悉=IF()

,则类似于Excel
ifelse(years < 1986, "old", ifelse(years < 1996, "medium", "young"))