迭代集合的子集

时间:2014-01-09 11:31:09

标签: r functional-programming

我有一组数据对象(比如x1x2x3)。

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])代替apply(cbind(x1[,X], x3[,X])中的colSummary^

这可能吗?

1 个答案:

答案 0 :(得分:1)

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

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))