我有以下数据框:
dm <- data.frame(vehid = rep(c(2,3), each=10),
frameid=rep(c(7,10,11,13,6,5,14,13,12,1),2),
frame.diff = rep(c(NA,3,1,2,7,1,9,1,1,11), 2),
s.frame = rep(c(rep(0,9), 12), 2))
对于s.frame!=0
我想要检测frameid
至frameid
序列中的所有s.frame
,并为其分配值loop
.
给其他人。
> dom
vehid frameid frame.diff s.frame loop
1 2 7 NA 0 loop
2 2 10 3 0 loop
3 2 11 1 0 loop
4 2 13 2 0 .
5 2 6 7 0 loop
6 2 5 1 0 loop
7 2 14 9 0 .
8 2 13 1 0 .
9 2 12 1 0 loop
10 2 1 11 12 loop
11 3 7 NA 0 loop
12 3 10 3 0 loop
13 3 11 1 0 loop
14 3 13 2 0 .
15 3 6 7 0 loop
16 3 5 1 0 loop
17 3 14 9 0 .
18 3 13 1 0 .
19 3 12 1 0 loop
20 3 1 11 12 loop
在上面的例子中,对于vehid
两个,序列是1到12(frameid:s.frame)。输出显示序列的'loop'一词和'。'为所有其他人
应该有一个简单的解决方案,但我无法弄清楚。如果有人提供data.table
或plyr
解决方案,我们将不胜感激。感谢。
答案 0 :(得分:3)
我不确定我是否正确理解了您的问题,但这是一个data.table
选项
library(data.table)
setDT(dm)[, loop := ifelse(frameid %between% c(frameid[s.frame != 0], s.frame[s.frame != 0]), "loop", "."), by = vehid]
dm
# vehid frameid frame.diff s.frame loop
# 1: 2 7 NA 0 loop
# 2: 2 10 3 0 loop
# 3: 2 11 1 0 loop
# 4: 2 13 2 0 .
# 5: 2 6 7 0 loop
# 6: 2 5 1 0 loop
# 7: 2 14 9 0 .
# 8: 2 13 1 0 .
# 9: 2 12 1 0 loop
# 10: 2 1 11 12 loop
# 11: 3 7 NA 0 loop
# 12: 3 10 3 0 loop
# 13: 3 11 1 0 loop
# 14: 3 13 2 0 .
# 15: 3 6 7 0 loop
# 16: 3 5 1 0 loop
# 17: 3 14 9 0 .
# 18: 3 13 1 0 .
# 19: 3 12 1 0 loop
# 20: 3 1 11 12 loop
答案 1 :(得分:1)
使用dplyr
library(dplyr)
dm %>%
group_by(vehid) %>%
mutate(loop= c(".", "loop")[(max(frameid[!!s.frame]) <= frameid & frameid <= min(s.frame[!!s.frame]))+1])
# vehid frameid frame.diff s.frame loop
# 1 2 7 NA 0 loop
# 2 2 10 3 0 loop
# 3 2 11 1 0 loop
# 4 2 13 2 0 .
# 5 2 6 7 0 loop
# 6 2 5 1 0 loop
# 7 2 14 9 0 .
# 8 2 13 1 0 .
# 9 2 12 1 0 loop
# 10 2 1 11 12 loop
# 11 3 7 NA 0 loop
# 12 3 10 3 0 loop
# 13 3 11 1 0 loop
# 14 3 13 2 0 .
# 15 3 6 7 0 loop
# 16 3 5 1 0 loop
# 17 3 14 9 0 .
# 18 3 13 1 0 .
# 19 3 12 1 0 loop
# 20 3 1 11 12 loop