繁体   English   中英

错误:替换的长度为零

[英]Error: replacement has length zero

我有 2 个数据框,即 df1 有大约 2000 个数据点和 100 列。 我创建了 df2,它是 df1 的复制,并通过对 df1 执行一些计算来填充 df2。这是我的代码:

for(i in 1:ncol(df1)){
  for(j in 1:nrow(df1)-9){df2[i,j] = (df1[i,j+9]/df1[i,j]) -1}
}

[<-.data.frame ( *tmp* , 1, j, value = numeric(0)) 中的错误:替换的长度为零

我收到错误:替换的长度为零。 任何人都可以向我提出上述代码的问题。

正如@AK88 提到的,您的循环的问题是从左到右的分辨率:

尝试将此 nrow(df1)-9 放入括号 (nrow(df1)-9)

您实际上是在执行1:nrow(df1)然后subtract 9

此外,我想我可能会提到 R 有很多基于list的助手,它们执行此类语句的速度要快得多,尽管它们需要一些时间来习惯。 查看apply系列函数和 Hadley 的Advanced R了解更多信息。

library(dplyr)

## example data
v <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
df1 <- data_frame(v1 = v, v2 = v, v3 = v, v4 = v, v5 = v, v6 = v, v7 = v, v8 = v, 
  v9 = 2 * v, v10 = 3 * v, v11 = 4 * v, v12 = 5 * v, v13 = 6 * v, v14 = 2 * 
    v, v15 = 3 * v, v16 = 4 * v, v17 = 5 * v, v18 = 8 * v, v19 = 2 * v, 
  v20 = 10 * v)

df2 <- data_frame()

system.time(for (i in 1:ncol(df1)) {
  for (j in 1:(nrow(df1) - 9)) {
    df2[i, j] = (df1[i, j + 9]/df1[i, j]) - 1
  }
})
#>    user  system elapsed 
#>   0.472   0.008   0.484

## a good bit faster (although negligible at this size)
system.time(tmp <- mapply(function(x, y) {
  (x/y) - 1
}, df1[, (9 + 1):nrow(df1)], df1[, 1:(nrow(df1) - 9)]) %>% as_data_frame())
#>    user  system elapsed 
#>   0.000   0.000   0.003

identical(tmp, df2)
#> [1] TRUE

为了将来参考,在您的问题中包含示例数据集并使用reprex包可以使其他人更容易帮助您。

更新:根据进一步的讨论,您的行和列混淆似乎是无意的(问题的原始陈述可能需要方形数据集或类似的东西)。 反转您的行/列索引或您的nrow / ncol语句将解决该问题。

看来您已经在条件中调换了“nrow”和“ncol”。 内部循环遍历您的列,但索引为 nrow-9。 由于您有更多的行作为列,因此循环到达最后一列,并且不再可以使用 column+1 进行计算。 因此,替换为 0。

使用此代码它应该可以工作:

for(i in 1:nrow(df1)){
  for(j in 1:ncol(df1)-9){df2[i,j] = (df1[i,j+9]/df1[i,j]) -1}
}

这样做,您将对前 91 列的所有行进行计算。 这是你想做的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM