在R中计算向量中重复数字序列的长度。

3

这里是数据:

marker <- c(0,0,0,0,3,3,0,0,5,5,5,0,0,0,
            1,1,2,2,2,2,0,0,1,1,1,3,3,3,
            1,1,2,2,2,0,0,1,1,1,5,5,5,5)

这些标记显示参与者在眼动追踪研究中正在进行的活动,其中 0 = 没有试验,1 = 试验开始,2、3、5 = 不同类型的任务。第一个 1 之前的数据是眼动仪测试数据,可以被舍弃。

我需要做什么(最好使用 dplyr):

  1. 删除第一个 1 之前的数据。
  2. 计算重复数字序列的长度(n_samples)。
  3. 为每个试验分配 ID 号码,为没有试验和试验开始分配 0 (trial_number)。

期望输出结果:

marker  n_samples  trial_number
1       2          0
1       2          0
2       4          1
2       4          1
2       4          1
2       4          1
0       2          0
0       2          0
1       3          0
1       3          0
1       3          0
3       3          2
3       3          2
3       3          2
1       2          0
1       2          0
2       3          3
2       3          3
2       3          3
0       2          0
0       2          0
1       3          0
1       3          0
1       3          0
5       4          4
5       4          4
5       4          4
5       4          4

我发现了这个答案,但是无法修改代码以适应我的任务。

谢谢!


你具体尝试了什么代码?通常来说,修复你尝试过的代码比重新开始更容易。 - MrFlick
2个回答

3

使用dplyrdata.tablerleid函数。

library(dplyr)

tibble(marker) %>%
  #Drop rows before first 1
  filter(row_number() >= match(1, marker)) %>%
  #Count samples in each group
  add_count(grp = data.table::rleid(marker), name = 'n_samples') %>%
  #Create trial number
  mutate(trial_number = with(rle(!marker %in% c(1, 0)), 
                            rep(cumsum(values) * values, lengths))) %>%
  select(-grp)

这将返回 -

#   marker n_samples trial_number
#1       1         2            0
#2       1         2            0
#3       2         4            1
#4       2         4            1
#5       2         4            1
#6       2         4            1
#7       0         2            0
#8       0         2            0
#9       1         3            0
#10      1         3            0
#11      1         3            0
#12      3         3            2
#13      3         3            2
#14      3         3            2
#15      1         2            0
#16      1         2            0
#17      2         3            3
#18      2         3            3
#19      2         3            3
#20      0         2            0
#21      0         2            0
#22      1         3            0
#23      1         3            0
#24      1         3            0
#25      5         4            4
#26      5         4            4
#27      5         4            4
#28      5         4            4        

非常感谢Ronak!这在我的较大的数据框上按预期工作,并且很好地适应了管道。 - Polina B

1
基于 R 的解决方案
marker <- c(0,0,0,0,3,3,0,0,5,5,5,0,0,0,
            1,1,2,2,2,2,0,0,1,1,1,3,3,3,
            1,1,2,2,2,0,0,1,1,1,5,5,5,5)

tmp=marker[which(marker==1)[1]:length(marker)]

abc=rle(tmp)

df=data.frame(
  "marker"=tmp,
  "n_samples"=rep(abc$lengths,abc$lengths)
)

abc$values[abc$values<=1]=0
abc$values[abc$values>1]=1
abc$values[abc$values==1]=cumsum(abc$values[abc$values==1])

df$trial_number=rep(abc$values,abc$lengths)

这会导致
   marker n_samples trial_number
1       1         2            0
2       1         2            0
3       2         4            1
4       2         4            1
5       2         4            1
6       2         4            1
7       0         2            0
8       0         2            0
9       1         3            0
10      1         3            0
11      1         3            0
12      3         3            2
13      3         3            2
14      3         3            2
15      1         2            0
...

谢谢!dplyr方案更适合我的工作流程,但你的也可以,所以两个答案都点赞。 - Polina B

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