将R代码存储在列表中

时间:2014-02-19 21:22:08

标签: r list

我在大型数据框中进行了大量的条件分配。 (这是一个用数字组成的例子)

x<-data.frame(average=c(2,6,7,4,9),bill=c(3,7,5,2,5),averagebill=c(8,2,5,3,4),averagecost=c(1,6,4,7,8),xcount=c(4,5,2,8,1),ycount=c(7,4,2,8,8))

在伪代码中,我正在做的简短版本是:

if xcount > 3
   newaverage<-averagecost
   newbill<-averagebill
else if ycount > 3
   newaverage<-average
   newbill<-bill

一种方法是使用嵌套的ifelse()函数

y<-within(x, { newaverage<-ifelse(xcount > 3,averagecost,
                      ifelse(ycount > 3,average,NA))

               newbill<-ifelse(xcount > 3,averagebill,
                      ifelse(ycount > 3,bill,NA))
    })

这样可行但是我的实际代码分配了2个以上的变量,并且它变得重复且难以阅读。此外,ifelse()并不是必需的。这是另一种方式:

y<-within(x, { newaverage[xcount > 3] <- averagecost[xcount > 3]
               newbill[xcount > 3] <- averagebill[xcount > 3]

               newaverage[xcount <= 3 & ycount > 3] <- average[xcount <= 3 & ycount > 3]
               newbill[xcount <= 3 & ycount > 3] <- bill[xcount <= 3 & ycount > 3]
    })

这样更好,但“xcount&lt; = 3&amp; ycount&gt; 3”仍然过于重复。我发现我可以用列表简化:

z<-list("xcon"=x$xcount>3,"ycon"=x$xcount<=3 & x$ycount>3)
y<-within(x, { newaverage[z[["xcon"]]] <- averagecost[z[["xcon"]]]
               newbill[z[["xcon"]]]    <- averagebill[z[["xcon"]]]

               newaverage[z[["ycon"]]] <- average[z[["ycon"]]]
               newbill[z[["ycon"]]]    <- bill[z[["ycon"]]]
    })

正如您所看到的,这更容易阅读并且更易于维护。如果我需要更改条件,我只需编辑一次列表,而不是完成每项任务。

我的问题是,这实际上是一个好习惯吗?我从来不知道代码可以存储在列表中,而且当我有重复的代码时,我可以看到它在将来很有用。或者是否有更优雅的方式来做到这一点?

编辑:将x $添加到最后一个示例

0 个答案:

没有答案