如何在R中将特定序列的值分配到列中?

3

数据

我有以下数据框:

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 ,我希望检测出所有从 frameids.frame 顺序的 frameid 并将它们赋值为 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的解决方案,我将不胜感激。 谢谢。

每个“vehid”在“s.frame”中只有一个非零元素吗? - alexis_laz
在我的初步数据探索中,“vehid”仅有一个非零元素。 - umair durrani
2个回答

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:12,其中1在frameid中,12在s.frame中。它不在min(s.frame)max(s.frame)之间,因为min(s.frame)始终等于零。 - umair durrani
@umairdurrani,输出结果是否符合预期?使用library(dplyr) dm %>% mutate(loop = ifelse(frameid <= 12, 'loop', '.'))可以得到相同的结果。 - Paulo E. Cardoso
@PauloCardoso 这里的输出与所需结果相符,但代码并未完成所需的操作。这里的代码查看 s.frame 的最小值和最大值,并将其视为一个序列,然后将 loop 分配给该序列。这是不必要的。我正在查看的序列从 frameid 中的值开始,其对应的 s.frame 不等于0(在此数据帧中为1),并以相应的 s.frame 值结束(在此数据帧中为12)。对于所有1到12之间的 frameid,列 loop 应包含字符串“loop”。希望现在清楚了。 - umair durrani
@umairdurrani,看到我的编辑了吗?希望这就是你想要的。 - David Arenburg
我终于动了脑筋,在您的代码上稍作修改,实现了期望的输出结果:setDT(dm)[, p := ifelse(frameid%between% c(min(s.frame[s.frame !=0 ]), max(frameid[s.frame !=0])), "loop", "."), by = vehid]。非常感谢! - umair durrani
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接