繁体   English   中英

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

[英]How to assign a value to a particular sequence in a column in 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我想检测所有frameid它们的序列中frameids.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解决方案,我将不胜感激。 谢谢。

我不确定我是否理解你的问题,但这是一个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

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM