首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历集合的子集

遍历集合的子集
EN

Stack Overflow用户
提问于 2014-01-09 11:31:09
回答 1查看 40关注 0票数 0

我有一个数据对象集合(比如x1x2x3)。

代码语言:javascript
复制
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

代码语言:javascript
复制
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`‘。

代码语言:javascript
复制
varList1 <- c('x1', 'x3')
varList2 <- c('x2', 'x3')

我曾经使用过do.call和嵌套的lapply,但不知道如何修改colSummary,以便将cbind(...)替换为传递给函数的对象列表(如varList1)的引用。

当我在varList1中传递时,所需的函数将返回与以下函数相同的输出。

代码语言:javascript
复制
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])

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-09 11:49:32

您只需要在varList1调用中使用lapply,而不是1:ncol(x1)[接受字符输入,以匹配对象的行\colname。

代码语言:javascript
复制
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为您提供了相同的输出,但是使用了名为list的元素。

编辑

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

代码语言:javascript
复制
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的使用有时被看作是un您最好将数据传递到您的函数中,即:

代码语言:javascript
复制
colSummary <- function(ff,vars)
{      
  sapply(names(vars[[1]]),
    function(X) apply(
       do.call(cbind,lapply(vars,"[",,X)),
     1, ff),
  simplify=FALSE)
}

然后打电话给

代码语言:javascript
复制
colSummary("mean",list(x1,x3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21018992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档