如何为r中的列中的特定序列赋值?

时间:2014-08-11 19:27:33

标签: r

数据

我有以下数据框:

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我想要检测frameidframeid序列中的所有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.tableplyr解决方案,我们将不胜感激。感谢。

2 个答案:

答案 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