2012-10-31 34 views
0

可能重复:
R if with vectorized statements优化“如果” R中的数据帧的一行功能

有一些类似的问题如何在这里最好的矢量化的功能,但我可以” t找到一个应用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中的解决方案。会更好的方法使用适用?还是有更简单的东西?

谢谢!

+0

的*另见*节如果“'告诉你看看'ifelse',它就是你想要的。 –

回答

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()语句,如果你有2度以上的条件下,与Excel类似的,如果你熟悉=IF()

ifelse(years < 1986, "old", ifelse(years < 1996, "medium", "young")) 
+0

谢谢!这非常有帮助! – jsnider

4

ifelse在这里更有意义。

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

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

+0

工程就像一个魅力。谢谢! – jsnider