将函数中的值传递给ddply

时间:2013-05-31 11:13:47

标签: r plyr

我已ddply沿着这些方向构建data.frame

out <- ddply(data, .(names), varA = sum(value > 10))

工作正常,所以我试图把它放到一个函数

func <- function(val.in) {
    out <- ddply(data, .(names), varA = sum(value > val.in))
}

func(10)

这不起作用 - 看起来ddply无法找到'val.in'

Error in eval(expr, envir, enclos) : object 'val.in' not found

任何人都知道为什么?

如果背景不够,请告诉我,我会更新。

2 个答案:

答案 0 :(得分:13)

我尝试使用ddply下的示例中的一些示例数据重新创建您的问题。

首先,一些示例数据:

dfx <- data.frame(
  group = c(rep('A', 8), rep('B', 15), rep('C', 6)),
  sex = sample(c("M", "F"), size = 29, replace = TRUE),
  age = runif(n = 29, min = 18, max = 54)
)

head(dfx)
#   group sex      age
# 1     A   F 53.08787
# 2     A   M 30.47225
# 3     A   F 26.78341
# 4     A   F 26.46841
# 5     A   F 34.65360
# 6     A   M 21.26691

以下是您可能会尝试的内容(我假设您打算在问题中使用summarize)。

library(plyr)
ddply(dfx, .(group, sex), summarize, varA = sum(age > 25))
#   group sex varA
# 1     A   F    5
# 2     A   M    1
# 3     B   F    6
# 4     B   M    4
# 5     C   F    3
# 6     C   M    2

然后我们可以尝试在函数中使用它,如下所示:

func <- function(val.in) {
  out <- ddply(dfx, .(group, sex), summarize, varA = sum(age > val.in))
  out
}

func(25)
# Error in eval(expr, envir, enclos) : object 'val.in' not found

^^你的错误是^^


最直接的解决方案是使用here(帮助ddply找出查找内容的位置):

func <- function(val.in) {
  out <- ddply(dfx, .(group, sex), here(summarize), varA = sum(age > val.in))
  out
}

func(25)
#   group sex varA
# 1     A   F    5
# 2     A   M    1
# 3     B   F    6
# 4     B   M    4
# 5     C   F    3
# 6     C   M    2

更新

据我所知,这似乎不是“dplyr”中的一个问题:

library(dplyr)
myFun <- function(val.in) {
  dfx %>% group_by(group, sex) %>% summarise(varA = sum(age > val.in))
}
myFun(10)
# Source: local data frame [6 x 3]
# Groups: group
#
#   group sex varA
# 1     A   F    5
# 2     A   M    3
# 3     B   F    7
# 4     B   M    8
# 5     C   F    2
# 6     C   M    4

答案 1 :(得分:0)

好像你想编写一个匿名函数并传入第二个参数:

func<-function(val.in){
    ddply(data, .(names), function(value,val.in) data.frame(varA=sum(value>val.in)), val.in)
}