这里有一些关于如何最好地矢量化函数的类似问题,但我还没有找到一个应用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中必须有一个更“优雅”的解决方案。使用更好的方法吗?或者有更简单的东西吗?
谢谢!
答案 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()
ifelse(years < 1986, "old", ifelse(years < 1996, "medium", "young"))