我有一组数据对象(比如x1
,x2
和x3
)。
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^
。
这可能吗?
答案 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
注意我还使用sapply
和simplify=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)
}
mget
和get
的使用有时被视为非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))