【问题标题】:for loop conditional based on prior row基于前一行的循环条件
【发布时间】:2020-04-05 03:14:54
【问题描述】:

我有一个按每场比赛的顺序记录足球比赛比赛的数据库。我想制作一个 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 - 中的错误: 参数长度为零

【问题讨论】:

  • 从2开始:2:nrow(example)
  • 什么是 example$iced?代码说:如果“if-condition”中的内容为真,则打印“example$iced[i] == 1”是否为真。这就是你想要完成的事情。您只是想评估这种情况?
  • 2:nrow(example) 可以正常工作,如果只考虑游戏就可以工作。但对于一个数据帧中的多个游戏,它会返回:“if (example$field_goal_attempt[i] == 1 & example$timeout[i - : 需要 TRUE/FALSE 的缺失值”中的错误”

标签: r loops for-loop


【解决方案1】:

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

  1. for 循环遍历剧本,就像在您的情况下一样 - 也就是说,i 代表一个投篮得分,i-1 代表之前的剧本。正如@SmokeyShakers 所建议的那样,您将从 2 开始:
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
 }
}

请注意,我还建议您使用&amp;&amp; 而不是&amp;,因为在前一种情况下,逻辑语句被逐个评估并在第一个FALSE 处停止,而后者 (&amp;) 会评估 if 语句的所有部分,即使遇到错误的部分也是如此,因此会浪费计算时间。 此外,正如 cmets 中的 @Jorge 所建议的那样,我还将 == 替换为赋值运算符 &lt;-,因为在我看来您希望分配 10 , 不计算 example$iced[i] 是否分别等于 10 的逻辑语句。

  1. 查看此问题的另一种方法是考虑由i 表示的潜在超时,目标尝试是i+1,并且您的循环需要提前1 终止:
for (i in 1:(nrow(example)-1)) {
 if (example$field_goal_attempt[i+1] == 1 && example$timeout[i] == 1 && example$timeout_team[i] != example$posteam[i]) {
  example$iced[i+1] <- 1
 } else {
 example$iced[i+1] <- 0
 }
}

【讨论】:

  • 关于您上面的评论:...但是对于一个数据框中的多个游戏,它会返回:“if (example$field_goal_attempt[i] == 1 & example$timeout [i - : 需要 TRUE/FALSE 的缺失值 - 你如何在一个数据帧中存储然后遍历多个游戏?
  • 这个df中基本上有数千场比赛,一旦结束,下一场比赛就从上一场比赛最后一场比赛下方的第一场比赛开始。
  • if (example$field_goal_attempt[i] == 1 && example$timeout[i - : 需要 TRUE/FALSE 的缺失值) 中的错误
  • 我明白了 - 数据框中是否有任何列指示它是哪个游戏?您能否发布一个示例,说明数据框的重要部分是什么样的?我建议您添加另一个条件来检查 ii-1 两条线(或 ii+1,如果您选择第二条路线)来自同一个游戏。
  • 是的,game_id 是每个游戏的数字列。我不担心添加另一个条件,因为不可能有以 fg 开头的游戏,所以我认为这不会是一个问题。
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 2014-09-12
  • 1970-01-01
  • 2020-12-11
  • 2014-05-21
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多