基于先前行的循环条件

时间:2019-12-11 19:14:33

标签: r loops for-loop

我有一个数据库,其中按足球比赛的顺序进行比赛。我想进行一个for循环,以检查射门得分(上一行)之前的比赛是否被另一支球队暂停。我尝试使用下面的[i-1],但不确定是否会因为出现错误而起作用。

for (i in 1:nrow(example)) {
 if (example$field_goal_attempt[i] == 1 & example$timeout[i-1] == 1 & example$timeout_team[i-1] != 
example$posteam[i-1]) {
example$iced[i] == 1
} else {
 example$iced[i] == 0
}
}

example <- data.frame(game_id = c(10,10,10,10,10,13,13,13,13,13), 
field_goal_attempted = c(0,0,0,1,0,0,0,0,0,0), time_out = 
c(0,0,1,0,0,0,0,0,0,0), posteam = 
c("PIT","PIT","PIT","PIT","PIT","ATL","ATL","WAS","WAS","WAS"), timeout_team 
= c(NA, NA, "TEN",NA,NA,NA,NA,NA,NA,NA))

在新窗口中显示清除输出展开/折叠输出 if(example $ field_goal_attempt [i] == 1&example $ timeout [i-:   参数的长度为零

1 个答案:

答案 0 :(得分:0)

您基本上可以通过两种方式查看问题的逻辑:

  1. for循环播放剧情,就像您遇到的情况一样-也就是说,i代表一场是射门得分,i-1代表上一场。根据{{​​1}}的建议,您将从2开始:
@SmokeyShakers

请注意,我还建议您使用for (i in 2:nrow(example)) { if (example$field_goal_attempt[i] == 1 && example$timeout[i-1] == 1 && example$timeout_team[i-1] != example$posteam[i-1]) { example$iced[i] <- 1 } else { example$iced[i] <- 0 } } 而不是&&,因为在前一种情况下,逻辑语句被一个一个地求值,并在第一个{ {1}},而后者(&)评估FALSE语句的所有部分,即使遇到错误的语句也是如此,从而浪费了计算时间。 此外,根据评论中&的建议,我还用赋值运算符if替换了@Jorge,因为在我看来您想分配{ {1}}或==不会评估逻辑语句<-分别等于10

  1. 查看此问题的另一种方法是考虑由example$iced[i]表示的潜在超时,目标尝试为1,并且您的循环需要在1之前终止。
0