我已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
任何人都知道为什么?
如果背景不够,请告诉我,我会更新。
答案 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)
}