在R区发现不成功的传球导致失误(被对手拦截)
我试图找出每个球员的失败传球次数,从而导致对手的失误(因此拦截)。请参见列在R区发现不成功的传球导致失误(被对手拦截),r,dt,R,Dt,我试图找出每个球员的失败传球次数,从而导致对手的失误(因此拦截)。请参见列type_name和result_name,发生这种情况的情况在第43行和第46行(因此,第42行和第45行是不成功的通过,应予以计数) 总而言之:值TRUE应该只出现在第42行和第45行,因为这些失败的传球导致对手成功拦截。这里有一个tidyverse解决方案,您也可以使用: library(dplyr) df1 %>% mutate(to_turnover = ifelse((type_name == &q
type_name
和result_name
,发生这种情况的情况在第43行和第46行(因此,第42行和第45行是不成功的通过,应予以计数)
总而言之:值TRUE应该只出现在第42行和第45行,因为这些失败的传球导致对手成功拦截。这里有一个
tidyverse
解决方案,您也可以使用:
library(dplyr)
df1 %>%
mutate(to_turnover = ifelse((type_name == "pass" & result_name == "fail") &
(lead(type_name) == "interception" & lead(result_name) == "success"),
TRUE, NA))
下面是一个
数据表方法
library(data.table)
setDT(df1)
df1[type_name == "pass" &
result_name == "fail" &
shift(type_name, type = "lead") == "interception" &
shift(result_name, type = "lead") == "success",
to_turnover := TRUE]
我对你如何选择你的观察结果感到有点困惑。请你再解释一下你选择观察的标准好吗?为什么不计算行37
,那些成功的拦截,例如行43
和46
(我稍微更改了数据帧,并添加了另一列:时间\秒
)。数据帧按顺序显示匹配的一部分(可以从每行的时间秒数增加中看出)。因此,我想获得这样的情况:行I
是通过=='fail
,而行I+1
是拦截=='success
。因此,标准应该是:type\u name[i]==通过和结果\u name[i]==失败
,然后type\u name[i+1]==拦截和结果\u name[i+1]==成功
谢谢!这确实是应该采取的两行措施。但是,他们应该在总数据帧中返回一个T/F,就像在Wimpel his答案中所做的那样。你的意思是你想添加一个带有逻辑值的额外列吗?是的,所以最终答案应该显示我的问题中所述的总输出OK我修改了我的代码,这样就得到了你想要的输出。
library(dplyr)
df1 %>%
mutate(to_turnover = ifelse((type_name == "pass" & result_name == "fail") &
(lead(type_name) == "interception" & lead(result_name) == "success"),
TRUE, NA))
library(data.table)
setDT(df1)
df1[type_name == "pass" &
result_name == "fail" &
shift(type_name, type = "lead") == "interception" &
shift(result_name, type = "lead") == "success",
to_turnover := TRUE]