我正在尝试创建一种能够产生每种疾病的平均成本的函数。我敢肯定这不是最好的方法,但是当我把它作为列索引时,它似乎确实有效。但是,当我将它包装在函数中并执行代码时,我得到一个解析错误:
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),这似乎工作正常。我只是有点困惑为什么它在我手动操作时有效,但它作为一个功能失败了。提前感谢您的帮助。
答案 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循环不是最有效的方法。