列可能不存在时使用$进行子集

时间:2014-11-25 23:09:41

标签: r dataframe subset

我正在编写一个由ifelse语句组成的函数,这些语句依赖于函数输入的不同列中的值:

counter=function(df){
df$total2=ifelse(df$x>=100,df$total+10,df$total)
df$total3=ifelse(df$y>=200,df$total2+10,df$total2)
}

看起来我这样做的方式效率很低,但我还没有想过要避免覆盖计算的方法。

但更紧迫的是,我想要使用此功能的一些dfs没有列x和列y。当我在这些上运行它时,会出现以下错误;

$<-.data.frame*tmp*,&#34; total3&#34;,value = logical(0))出错:   替换有0行,数据有74个

有没有办法重写这个以允许没有所有列的数据帧?

谢谢。

1 个答案:

答案 0 :(得分:3)

您可以使用标准if查看列是否存在

counter <- function(df) {
    if ("x" %in% names(df) ) {
        df<- transform(df, total2=ifelse(x>=100,total+10,total)
    }
    if("y" %in% names(df) ) {
        df <- transform(df, total3=ifelse(y>=200,total2+10,total2)
    }
}

虽然您的数据似乎可能在广泛的范围内。格式化时可能更容易在a&#34; tall&#34;格式。您可能希望研究重塑数据。