我有一个数据对象集合(比如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或varList2tocolSummary`‘。
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])。
这个是可能的吗?
发布于 2014-01-09 11:49:32
您只需要在varList1调用中使用lapply,而不是1:ncol(x1)。[接受字符输入,以匹配对象的行\colname。
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为您提供了相同的输出,但是使用了名为list的元素。
编辑
经过澄清,我相信这是你想要的。您可以使用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的使用有时被看作是un您最好将数据传递到您的函数中,即:
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))https://stackoverflow.com/questions/21018992
复制相似问题