解析for循环中的错误

时间:2017-03-02 01:29:46

标签: r for-loop

我正在尝试创建一种能够产生每种疾病的平均成本的函数。我敢肯定这不是最好的方法,但是当我把它作为列索引时,它似乎确实有效。但是,当我将它包装在函数中并执行代码时,我得到一个解析错误:

    Error in parse(text = x) : <text>:1:2: unexpected '=='
1:  ==
     ^

以下是一些示例数据:

t <- data.frame(Asthma = c(0, 1, 1, 0, 1),
                Diabetes = c(1, 0, 1, 0, 0),
                CF = c(1, 0, 0, 0, 0),
                AnnualSpend = c(12345, 23323, 50000, 10000, 543))

这是我的for循环:

y <- data.frame()

for(i in 1:ncol(t)-1) {

  n <- names(t[i])

  s <- paste(n, " == 1", sep="")    

  r <- t %>% filter_( s ) %>%
             summarize( Avg = mean(AnnualSpend) )

  x <- cbind(n,r)

  y = rbind(x,y)

}

我用1作为列索引逐步完成它,然后使用parse(text = s),这似乎工作正常。我只是有点困惑为什么它在我手动操作时有效,但它作为一个功能失败了。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我将引导您找到代码被破坏的位置。

您在filter_行中收到错误,因此请检查您实际尝试应用的过滤器:

s
# [1] " == 1"

当然这是错误的。为什么会这样?您应该查看生成它的代码。它有什么问题?

n
# character(0)

嗯,这也没有意义,n应该是data.frame的名字之一。好的,让我们继续追溯:

names(t)
# [1] "Asthma"      "Diabetes"    "CF"          "AnnualSpend"
names(t)[i]
# character(0)

好的,所以它必须是i

i
# [1] 0

在R中,索引是基于1的,而不是基于0的,但您可能知道这一点。但是,它为0的原因是您指定了1:ncol(t)-1。根据操作顺序,这有效(1:ncol(t)) - 1,但我怀疑你打算1:(ncol(t)-1)

1:ncol(t) - 1
# [1] 0 1 2 3
1:(ncol(t) - 1)
# [1] 1 2 3

当您更改该代码时,结果如下:

y
#          n     Avg
# 1       CF 12345.0
# 2 Diabetes 31172.5
# 3   Asthma 24622.0

重要的是不仅要知道&#34;什么代码语言能做什么&#34;,但是能够通过代码(向前或向后)找到哪里也很重要症状变成问题来源。

答案 1 :(得分:1)

调试代码时,请在每一步打印输出。例如,我打印(i),我发现没有返回任何值,表明该功能甚至没有进入此步骤,这意味着问题是上游。

由于上游唯一的值是for语句,请检查for语句中的内容:

1:ncol(t)-1
# [1] 0 1 2 3

阅读声明,你要求seq 1:ncol(t)并从序列中减去1。因此我从零开始并且不正确。你缺少()(ncol(t)-1)。以下是更正后的代码。

for(i in 1:(ncol(t)-1)) {
  n <- names(t[i])
  s <- paste(n, " == 1", sep="")    
  r <- t %>% filter_( s ) %>%
    summarize( Avg = mean(AnnualSpend) )
  x <- cbind(n,r)
  y = rbind(x,y)
}

for循环不是最有效的方法。