我有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,值=数字(0)): 替换的长度为零
我收到错误:替换的长度为零。任何人都可以告诉我上述代码的问题。
答案 0 :(得分: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
语句将解决该问题。
答案 1 :(得分:0)
似乎你在条件中转换了“nrow”和“ncol”。内部循环遍历您的列,但索引为nrow-9。由于您有更多行作为列,循环到达最后一列,并且不再可能使用列+ 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列的所有行进行计算。这是你想要做的吗?