【问题标题】:for loop in R behaves in unexpected wayR中的for循环以意想不到的方式表现
【发布时间】:2015-06-30 13:40:08
【问题描述】:

我正在编写这个函数,而我的循环以不同的方式运行。你能解释一下为什么会这样以及如何纠正吗?

    complete <- function(directory, id = 1:332)  {
    specd <- list.files("specdata", full.names = TRUE)
    temp<- vector(mode = "numeric", (length = length(id)))
    for (i in id)   {
    temp[i] <- nrow(na.omit(read.csv(specd[i])))
    }
    return(data.frame(id = id, nobs = temp))
    }

代码:

complete("specdata", 1)OBSERVATION – id = 1; yields 1 answer
  id nobs
1  1  117
complete("specdata", 3) OBSERVATION – id = 3; yields 3 answers
  id nobs
1  3    0
2  3   NA
3  3  243
complete("specdata", 30:25) OBSERVATION – id = 30; yields 30 answers
complete("specdata", c(2, 4, 8, 10, 12))

在 data.frame(id = id, nobs) 中显示带有调试错误的 Traceback Rerun = temp) :参数暗示不同的行数:5、12

【问题讨论】:

  • 你需要给我们一些我们可以粘贴并执行的东西。
  • for (i in id) 应该是for (i in 1:id)
  • @RHertel,它正在正确绘制数字。
  • 那么循环似乎完全没有必要......它只检查大小写i=id
  • 你是对的,1:length(id) 会修复它。 @RHertel。

标签: r loops for-loop


【解决方案1】:

将代码函数中的这一行更改为:

temp<- vector()
for (i in 1:length(id))

【讨论】:

    【解决方案2】:

    试试这个:

    complete <- function(directory, id = 1:332)  {
    specd <- list.files("specdata", full.names = TRUE)
    temp<- c()
    for (i in id)   {
    temp <- c(temp,nrow(na.omit(read.csv(specd[i]))))
    }
    return(data.frame(id = id, nobs = temp))
    }
    

    行长度不匹配的原因是temp[i] 将输出分配给 temp 中的第 i 个地标。所以当你尝试c(2, 4, 8, 10, 12)。您期望为temp 获得一个长度为 5 的向量。但是你得到一个长度为 12 的向量。因为temp[12] 是输出的一个元素。所以temp 被拉长到那个长度。示例:

    x <- 1
    x
    [1] 1
    x[5] <- 2
    x
    [1]  1 NA NA NA  2
    

    当我为 x 的第五个元素赋值时,R 扩展了向量而不要求我执行任务。

    complete("specdata", 3) 返回 3 个答案,因为 temp 最初只有一个值 0。你在一开始就预先分配了它。然后 for 循环按照您的指示将 243 分配给 temp[3]。所以 R 为第二个值填写了一个 NA 值,剩下三个。

      id nobs
    1  3    0
    2  3   NA
    3  3  243
    

    【讨论】:

    • 它没有用。当我将其更改为: for (i in 1: length(id)) { temp[i] complete("specdata", 1) id nobs 1 1 117 > complete("specdata", 3) id nobs 1 1 243 > complete("specdata", 23) id nobs 1 1 492 > complete("specdata", 30:25) 在文件(file, "rt") 中显示带有调试错误的回溯重新运行:无效的 'description' 参数 > complete("specdata", c(2, 4, 8, 10, 12 )) 显示回溯
    猜你喜欢
    • 2013-11-07
    • 2013-12-27
    • 1970-01-01
    • 2017-07-04
    • 2019-04-05
    • 2014-01-19
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多