2

假设我有一个包含许多列的数据框和一个我希望应用的特定摘要过程。可能有几列我有兴趣总结,例如baseball数据集的第 2、3 和 4 列:

   ddply(baseball, .(year), "nrow")
   ddply(baseball, .(stint), "nrow")
   ddply(baseball, .(team), "nrow")

当然,我可能希望应用更复杂的摘要并有更多的输出列,但让我们坚持假设摘要将由单个列完成,并且我可能希望通过几列进行汇总。因此,让我们为摘要编写一个函数,这样我就可以轻松地更改用于 .(var) 的列:

   baseballByCol <- function(col) {
       ddply(baseball, .(baseball[,col]), "nrow")
   }

这几乎可以工作:baseballByCol(2)与输出相同,ddply(baseball, .(year), "nrow")除了whilecolnames(baseballByCol(2))是所需的。c("baseball[, col]", "nrow")colnames(ddply(baseball, .(year), "nrow"))c("year", "nrow")

当然我们可以解决这个问题:

   baseballByCol <- function(col) {
       df <- ddply(baseball, .(baseball[,col]), "nrow")
       colnames(df)[1] <- colnames(baseball)[col]
       return(df)
   }

现在 baseballByCol(2)与 的输出完全相同,ddply(baseball, .(year), "nrow")按我可以使用的时间来总结baseballByCol(3)等等。

但这闻起来有点难看。真的没有更好的方法来通过列索引而不是名称来引用“by”变量,而不是.(baseball[,col]), "nrow")把列名弄乱?

是否有更简洁的解决方案,其中函数将变量名作为参数而不是列索引?

4

1 回答 1

3
baseballByCol <- function(col) {
    ddply(baseball, col, "nrow")
}

适用于索引和列名。

于 2012-12-11T18:07:10.673 回答