我在大型数据框中进行了大量的条件分配。 (这是一个用数字组成的例子)
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 $添加到最后一个示例