2014-01-09 79 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