How do I assign a value to a specific sequence in a column in r?

Data

I have the following dataframe:

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))

      

Question

For s.frame!=0

I want to define everything frameid

that is in the sequence from frameid

to s.frame

and assign a value to them loop

and .

others.

Desired exit

> 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

      

In the above example, for both vehid

s, the sequence was 1 to 12 (frameid: s.frame). The output displays the word "loop" for the sequence and ".". for everyone else.
There should be a simple solution for this, but I can't figure it out. I would appreciate it if someone could provide a solution data.table

or plyr

. Thank.

+3


source to share


2 answers


I'm not sure if I understand your question correctly, but here's the option 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

      

+3


source


Using 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

      

+1


source







All Articles