我不确定我的问题是否过于抽象或过于理论化以至于无法保证这里人们的回应,但这里什么都没有:这是否适用于mapply?
我正在使用一个数据集,在该数据集上为我的数据的相同21个子集计算了(至少)6种不同类型的摘要,这样子集类型和摘要类型最终完全交叉:
- set.1.sum.1, set.2.sum.1...set.21.sum1
- set.1.sum.2, set.2.sum.2...set.21.sum2
- ...
- set.1.sum.6, set.2.sum.6...set.21.sum6
我的函数(set.sum.fn
),通过lapply
应用于包含子集规范的数据帧列表,要求我明确指定汇总类型作为参数。子集化数据具有不同的行数但具有相同的列。使用baseball
数据集进行说明,使用2个子集化dfs和2个汇总类型的列表:
require(plyr)
require(dplyr)
require(reshape2)
require(lazyeval)
# List of dataframes with various subsetting specifications for main df (baseball)
mylist <- list(
df1 = data_frame( id.filter = c( "aaronha01")) # w/ other conds. in real data
df2 = data_frame( id.filter = c( "zimmech01"))
# ...up to df21 in real data
)
# Function:
# df = dataframes (i.e., from mylist)
# sum.type = a quoted sum.type
# other.arg = an additional argument for illustrative purposes here
set.sum.fun <- function( df,
sum.type = c( "SUM", "SQRT"),
other.arg = c( "Monday", "Tuesday")) {
if ( sum.type == "SUM")
{
df <- baseball %>%
filter( id == eval( quote( df$id.filter))) %>%
group_by_( .dots = c( "lg")) %>%
summarize_( smashes = interp( ~ sum( hr))) %>%
mutate( new.id = paste( eval( quote( df$id.filter[1])), eval( quote( sum.type)),
eval( quote( other.arg)), sep = "."))
}
else if ( sum.type == "SQRT")
{
df <- baseball %>%
filter( id == eval( quote( df$id.filter))) %>%
group_by( .dots = c( "lg")) %>%
ddply( .( hr), transform, sqrt.hr = sqrt( hr)) %>%
summarize_( smashes = interp( ~ sum( sqrt.hr))) %>%
mutate( new.id = paste( eval( quote( df$id.filter[1])), eval( quote( sum.type)), eval( quote( other.arg)), sep = "."))
}
}
然后,我正在为原始列表mylist
中的每种和类型创建一个新的数据框列表:
sum.mylist<- mylist%>%lapply(set.sum.fun, "SUM", "Monday")
sqrt.mylist<-mylist%>%lapply(set.sum.fun, "SQRT", "Monday")
这显然不是处理这种情况的最佳方式。我的解决方案面临的众多问题包括: 1。摘要类型的手动规范,其中将摘要类型列表传递给sum.type
参数将是理想的;和 2。手动创建新列表,将输出附加到单个列表或大df是更可取的。
我已经阅读了一些关于使用mapply
使用多个列表(here和here)的帖子,但我似乎无法将这些答案应用于问题我我试图解决。