【问题标题】:Loop to select pairwise series循环选择成对系列
【发布时间】:2010-12-23 11:00:43
【问题描述】:

我在 R 中有一个data.frame,有 40 个系列,我想选择成对系列来应用一个函数,(即 serie 1 和 serie 21,serie 2 和 serie 22)。但是我收到以下代码错误:

for(i in 1:ncol(Date)) {
    pairwise <-Date[, c(i,i+20)]
}

我想在其他功能中使用pairwise

有人可以帮帮我吗?

提前致谢

【问题讨论】:

  • 您想使用什么“其他功能”? IE。你想对成对系列做什么。当索引就足够时,在循环中复制/复制数据以在其他功能中使用似乎没有什么意义。但是如果您告诉我们您要使用的功能,以及真正的问题是什么,也许我们可以提供更有效的解决方案?编辑您的问题以提供更多信息,或在此处添加评论。
  • 抱歉信息不足。我有一个数据框,其中包含 20 个国家的失业率和生产率,所以我的数据框中有 40 个系列。我必须选择de pairwise,因为我想使用“urca”包中的“ca.jo”函数,这让我可以研究“pairwise”系列之间的协整关系。如果我手动执行它需要很长时间,所以我想应用一个循环来让我立即实现它。 for(i in 1:ncol(Date)) { pairwise
  • 你不需要pairwise,直接索引在ca.jo:rt &lt;- ca.jo(Date[, c(i,i+20)], K=2, season=spec="longrun")
  • 嗨,当我运行代码时:for(i in 1:ncol(Date)) { rt

标签: r iteration


【解决方案1】:

这是因为当i > 20 时,您请求的列高于 40。请参阅此示例:

set.seed(1)
DF <- data.frame(matrix(rnorm(40*100), ncol = 40))

## simple function to apply/use
foo <- function(x1, x2) return(x1 - x2)

## something to hold results
res <- matrix(ncol = ncol(DF), nrow = nrow(DF))

## loop - oops error
for(i in seq_len(ncol(DF))) {
    res[,i] <- foo(DF[,i], DF[,i+20])
}

你得到这个错误:

Error in `[.data.frame`(DF, , i + 20) : undefined columns selected

那是因为i 取值 1、...、40。只要 i >= 21,(i + 20) > 40,您就只有 40 列数据。一个简单的修改是只循环前 20 列:

## something to hold results
res <- matrix(ncol = ncol(DF) / 2, nrow = nrow(DF))
for(i in seq_len(ncol(DF)/2)) {
    res[,i] <- foo(DF[,i], DF[,i+20])
}

如果您只需要 col 1 和 col 21、col 2 和 col 22 等。如果您想要所有成对比较,那么您需要尝试不同的方法,因为单个循环不起作用。

(在有人因为循环使用效率低下而把我拉起来之前,那个例子就是这样,一个没有想象力的例子应用于函数foo()。在这种情况下,DF[, 1:20] - DF[, 21:40] 将给出与res.)

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2020-09-22
    • 2017-06-25
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多