我希望能够将列名发送到我正在ddply
拨打的电话。示例ddply
调用:
ddply(myData, .(MyGrouping), summarise, count=sum(myColumnName))
如果我将ddply
包装在另一个函数中,是否可以将其包装起来,以便我可以将myColumnName
的任意值传递给调用函数?
答案 0 :(得分:11)
必须有更好的方法。而我无法弄清楚如何使其与总结相结合。
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
>
答案 1 :(得分:7)
这似乎有效,尽管在这种情况下避免summarise
可能会更清晰(更安全),并像Justin所说的那样编写自己的匿名函数。
yr <- "year"
summarise(baseball,
duration = max(eval(parse(text = yr))) - min(eval(parse(text = yr))))
答案 2 :(得分:5)
正如@David Arenburg所说,这个问题已经很久了。今天,data.table
或dplyr
包可以以更快的速度为您提供相同的结果。
以下是答案的data.table
版本。
library(data.table)
my.fun <- function(myData, MyGrouping, myColumnName) {
setDT(myData)[, lapply(.SD, sum), by=MyGrouping, .SDcols=myColumnName]
}
答案 3 :(得分:0)
我想我找到了的工作方式并进行了总结。我不确定我是否理解为什么,因为我不是处理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