【问题标题】:Sending in Column Name to ddply from Function从函数发送列名到 ddply
【发布时间】:2012-04-16 16:43:03
【问题描述】:

我希望能够将列名发送给我正在拨打ddply 的电话。一个例子ddply调用:

ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName))

如果我将ddply 包装在另一个函数中,是否可以将其包装,以便我可以将任意值作为myColumnName 传递给调用函数?

【问题讨论】:

  • 你有一个可重现的例子(有数据,例如使用虹膜)?
  • @static_rtti 您是否专门寻找plyr 的答案?这个问题很老了,现在有更高级的包。
  • 好吧,我使用 plyr(并且不知道更高级的包),但如果你能用不同的包提供相同问题的答案,我也会觉得这很有趣。跨度>
  • 我原以为 here 会有所帮助,但它似乎并没有让事情变得更容易......
  • @static_rtti 答案是summarise 不是为此而设计的。与其他便利功能类似,您应该在以编程方式工作的某些情况下使用替代方法。

标签: r plyr


【解决方案1】:

必须有更好的方法。而且我不知道如何使它与摘要一起使用。

my.fun <- function(df, count.column) { 
  ddply(df, .(x), function(d) sum(d[[count.column]]))
}

dat <- data.frame(x=letters[1:2], y=1:10)

> my.fun(dat, 'y')
  x V1
1 a 25
2 b 30
> 

【讨论】:

  • 您可以将 count.column 直接传递给 ddply 中的函数,如:ddply(df, .(x), function(d) sum(d[[count.column]])) 意味着更少的代码并避免使用 eval
  • @TylerRinker 是的,那个 eval 是我试图让它与 summarise 一起工作时的保留。已编辑。
  • 我也尝试过这个(但因为不再真正使用 plyr)我也无法弄清楚如何使它与 summarise 一起工作。
【解决方案2】:

正如@David Arenburg 所说,这个问题已经很老了。今天,data.tabledplyr 软件包可以以更快的速度为您提供相同的结果。

这是答案的data.table 版本。

library(data.table)
my.fun <- function(myData, MyGrouping, myColumnName) { 
  setDT(myData)[, lapply(.SD, sum), by=MyGrouping, .SDcols=myColumnName]
}

【讨论】:

    【解决方案3】:

    我想我找到了一种工作总结的方法。我不确定我是否理解为什么,因为我不是处理 R 环境的专家,但这里是解决方案:

    > library(plyr)
    > 
    > 
    > 
    > ###########################
    > # Creating test DataFrame #
    > ###########################
    > 
    > x <- 1:15
    > 
    > set.seed(1)
    > y <- letters[1:3][sample(1:3, 15, replace = T)]
    > 
    > df <- data.frame(x, y)
    > 
    > ### check df
    > df
        x y
    1   1 a
    2   2 b
    3   3 b
    4   4 c
    5   5 a
    6   6 c
    7   7 c
    8   8 b
    9   9 b
    10 10 a
    11 11 a
    12 12 a
    13 13 c
    14 14 b
    15 15 c
    > 
    > 
    > #####################
    > # auxiliar function #
    > #####################
    > evalString <- function(s) {
    + eval(parse(text = s), parent.frame())
    + }
    > 
    > 
    > ### columnName input
    > columnName <- 'x'
    > 
    > ### call with columnName as input
    > xMeans <- ddply(df,
    +                 'y',
    +                 summarise,
    +                 mean = mean(evalString(columnName)))
    > 
    > 
    > ### regular call to ddply
    > xMeans2 <- ddply(df,
    +                 'y',
    +                 summarise,
    +                 mean = mean(x))
    > 
    > 
    > ### Compare Results
    > xMeans
      y mean
    1 a  7.8
    2 b  7.2
    3 c  9.0
    > xMeans2
      y mean
    1 a  7.8
    2 b  7.2
    3 c  9.0
    >   
    

    编辑:您可以使用基本包中的 get 函数,如下所示:ddply: how do I pass column names as parameters?

    > xMeans3 <- ddply(df,
    +                 'y',
    +                 summarise,
    +                 mean = mean(get(columnName)))
    > 
    > xMeans3
      y mean
    1 a  7.8
    2 b  7.2
    3 c  9.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多