2014-01-09 150 views
0

我有一个数据对象集合(说x1,x2和)。迭代集合的子集

require(xts) 
set.seed(1) 
x1 <- xts(data.frame(replicate(6, sample(c(1:10), 10, rep = T))), Sys.Date() + 1:10) 
x2 <- xts(data.frame(replicate(6, sample(c(1:10), 10, rep = T))), Sys.Date() + 1:10) 
x3 <- xts(data.frame(replicate(6, sample(c(1:10), 10, rep = T))), Sys.Date() + 1:10) 

它们都具有相同的列数。我希望找到这些集合的子集的统计汇总。我已经想出了如何做到这一点的情况下,我希望所有元素lapply:我使用下面的功能colSummary

colSummary <- function(ff) 
{ 
    lapply(1:ncol(x1), function(X) apply(cbind(x1[,X], x2[,X], x3[,X]), 1, ff)) 
} 

summary <- colSummary(`mean`) 
names(summary) <- colnames(x1) 

我希望能够找到相同的摘要信息的子集 - 通过传递的参数,如varList1或varList2 to colSummary`。

varList1 <- c('x1', 'x3') 
varList2 <- c('x2', 'x3') 

我打关于与do.call和嵌套lapply但不能弄清楚如何改变colSummary使得cbind(...)被替换为一个对象列表(如varList1),我传递到函数的引用。

当我通过varList1时,所需的函数将返回与以下函数相同的输出。

colSummary^ <- function(ff) 
{ 
    lapply(1:ncol(x1), function(X) apply(cbind(x1[,X], x3[,X]), 1, ff)) 
} 

而当在varList2通过将返回相同的输出作为上述功能colSummary^apply(cbind(x2[,X], x3[,X])colSummary^代替apply(cbind(x1[,X], x3[,X])取代。

这可能吗?

回答

1

您只需在lapply调用中使用varList1而不是1:ncol(x1)[接受字符输入以匹配对象的[行|列]名称。

colSummary <- function(ff,vars=NULL) 
{ 
    if (is.null(vars)) vars <- names(x1) 
    sapply(vars, function(X) apply(cbind(x1[,X], x2[,X], x3[,X]), 1, ff),simplify=FALSE) 
} 

colSummary("mean",c("X1","X3")) 
$X1 
2014-01-10 2014-01-11 2014-01-12 2014-01-13 2014-01-14 2014-01-15 2014-01-16 2014-01-17 2014-01-18 2014-01-19 
    5.333333 4.333333 4.666667 6.000000 2.666667 8.000000 3.000000 4.666667 3.000000 5.333333 

$X3 
2014-01-10 2014-01-11 2014-01-12 2014-01-13 2014-01-14 2014-01-15 2014-01-16 2014-01-17 2014-01-18 2014-01-19 
    7.666667 6.666667 7.333333 2.666667 6.333333 6.333333 5.333333 5.333333 6.333333 6.000000 

注意我也用sapplysimplify=FALSE给你相同的输出,但命名列表中的元素。

编辑

随着澄清,我相信这是你想要的。您可以使用mget来使用名称获取变量。

colSummary <- function(ff,vars=NULL) 
{ 
    if (is.null(vars)) vars <- c("x1","x2","x3") 
    sapply(names(x1), 
    function(X) apply(
     do.call(cbind,lapply(mget(vars,.GlobalEnv),"[",,X)), 
    1, ff), 
    simplify=FALSE) 
} 

使用mgetget有时被视为非R-样 - 你最好通过你的数据到您的函数,即:

colSummary <- function(ff,vars) 
{  
    sapply(names(vars[[1]]), 
    function(X) apply(
     do.call(cbind,lapply(vars,"[",,X)), 
    1, ff), 
    simplify=FALSE) 
} 

colSummary("mean",list(x1,x3)) 
调用
+0

+1为'sapply(...,简化= F)'技巧,但我认为我的含糊不清的问题已经让你失望。我试图将'apply(cbind(x1 [,X],x2 [,X],x3 [,X])''更改为apply(cbind(x1 [,X],x3 [,X])'当我传入'varList1'等等时,我编辑了一个问题来使这个更清晰。 – ricardo

+0

好吧,我想我已经把它整理好了,看看编辑 – James

+0

真棒,希望我会两次赞赏你。 – ricardo