获取contextstack溢出错误 - for循环中有太多嵌套的ifelse语句?

时间:2014-06-20 18:34:29

标签: r if-statement for-loop

我目前有一个for循环遍历每一行,检查行(下一行和当前行)之间和同一行内的多个条件是否为真。我收到一个错误:contextstack溢出。 我有一堆嵌套的ifelse语句(太多),并且想知道当有很多可能的条件组合要检查时,人们如何减少他们使用的ifelse语句的数量。你把它分解成多个循环吗? 我看到了一些方法,我可以将日期分成分组,并在分组中有ifelse语句(那么if if语句是否嵌套ifelse语句?)但我不确定这是否有助于我摆脱错误我我来了。

for (i in 1 : length(df$id)-1){ ifelse(many conditions, do this, ifelse(many conditions, do this,    ifelse(many conditions, do this, ...... ifelse(many conditions, do this, xxxxx) }

所以我基本上遍历每一行,因为我需要在每一行和前一行之间进行比较。主要问题是我似乎达到了允许嵌套的最大ifelse语句数。有没有办法更好地将其分组以减少限制因素,因为现在我的所有都是嵌套的。我可以有5个if语句(我的许多标准之一实际上是5级别的cateogry)然后将ifelse语句嵌套在其他标准中,这样循环不会评估每个ifelse语句吗?这在R中是否可行?

1 个答案:

答案 0 :(得分:0)

如果它是分类的话,请使用查找表:

> df = data.frame(x=1:5, y=letters[1:5])
> df
  x y
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e

> z=c("a", "c", "d")

缓慢的嵌套方式:

> ifelse(z == "a", 1, ifelse(z=="b", 2, ifelse(z=="c", 3, ifelse(z=="d", 4,ifelse(z=="e", 5, NA)))))
[1] 1 3 4

R路越快:

> df$x[sapply(z, function(x) which(x==df$y))]
[1] 1 3 4

如果是数字,则可以改为使用cut

> z = c(1.1, 2.23)
> df$y[cut(z, df$x)]
[1] a b