【问题标题】:Calculate lengths of sequences of repeating numbers in a vector in R计算R中向量中重复数字序列的长度
【发布时间】:2021-06-21 14:34:48
【问题描述】:

这是数据:

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

我找到了this 的答案,但无法修改代码以适应我的任务。

谢谢!

【问题讨论】:

  • 你到底尝试了什么代码?解决您尝试过的问题通常比从头开始更容易。

标签: r dplyr


【解决方案1】:

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

【讨论】:

  • 非常感谢罗纳克!这在我较大的数据框上按预期工作,并且非常适合管道。
【解决方案2】:

基础 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 解决方案更适合我的工作流程,但您的解决方案也适用,因此支持两个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2016-10-19
  • 2014-06-04
  • 2015-05-09
相关资源
最近更新 更多