R - 识别连续序列

标签 r sequence

我有一个包含 107635 行和 3 列的大文件:主题、感兴趣区域 (ROI) 和试验次数。 ROI 可以是 A、B、C、D、E、F。
我想要做的是只保留那些在 ROI 列中我有 B、C、D 连续序列的试验,当 B 第一次出现时。 B、C 和 D 出现多少次并不重要。

在下面的例子中,我可以保留 ntrial 78 和 201,因为第一次出现 B 之后是 C 和 D。
但是,我需要删除ntrial 10 和400。在trial 10 中,B、C 和D 不连续。在审判400中,B第一次出现,B后面没有C和D。

对于输出,我只需要一个值为 1 的列来保留每一行中的试验,并为与要删除的试验对应的行设置一个值为 0。

关于如何创建可以自动化程序的代码,而无需目视检查每个试验的任何建议?

非常感谢!

subject ROI ntrial output
sbj05   A   78     1
sbj05   A   78     1
sbj05   A   78     1
sbj05   A   78     1
sbj05   A   78     1
sbj05   A   78     1
sbj05   B   78     1
sbj05   B   78     1
sbj05   C   78     1
sbj05   D   78     1
sbj05   E   78     1
sbj05   E   78     1
sbj05   E   78     1
sbj05   A   201    1
sbj05   A   201    1
sbj05   A   201    1
sbj05   A   201    1
sbj05   A   201    1
sbj05   B   201    1
sbj05   C   201    1
sbj05   D   201    1
sbj05   E   201    1
sbj05   E   201    1
sbj05   E   201    1
sbj05   F   201    1
sbj05   F   201    1
sbj05   A   10     0
sbj05   A   10     0
sbj05   A   10     0
sbj05   A   10     0
sbj05   B   10     0
sbj05   A   10     0
sbj05   C   10     0
sbj05   D   10     0
sbj05   E   10     0
sbj05   E   10     0
sbj05   A   400    0
sbj05   A   400    0
sbj05   A   400    0
sbj05   B   400    0
sbj05   A   400    0
sbj05   B   400    0
sbj05   C   400    0
sbj05   C   400    0
sbj05   C   400    0
sbj05   D   400    0
sbj05   E   400    0
sbj05   E   400    0
sbj05   D   400    0

最佳答案

这是使用 data.table 的尝试和 stringi
首先,我定义了一些辅助函数,它可以帮助我检测 B 的第一次准确率。每组并验证它们后跟正确的序列

Myfunc <- function(x) {
               which(x == "B")[1L] == 
               stri_locate_first_regex(paste(x, collapse = ""), 'B*CD')[, 1L]
              } 

然后,实现是直截了当的
library(data.table)
library(stringi)
setDT(df)[, if(Myfunc(ROI)) .SD, by = .(subject, ntrial)]
#     subject ntrial ROI
#  1:   sbj05     78   A
#  2:   sbj05     78   A
#  3:   sbj05     78   A
#  4:   sbj05     78   A
#  5:   sbj05     78   A
#  6:   sbj05     78   A
#  7:   sbj05     78   B
#  8:   sbj05     78   B
#  9:   sbj05     78   C
# 10:   sbj05     78   D
# 11:   sbj05     78   E
# 12:   sbj05     78   E
# 13:   sbj05     78   E
# 14:   sbj05    201   A
# 15:   sbj05    201   A
# 16:   sbj05    201   A
# 17:   sbj05    201   A
# 18:   sbj05    201   A
# 19:   sbj05    201   B
# 20:   sbj05    201   C
# 21:   sbj05    201   D
# 22:   sbj05    201   E
# 23:   sbj05    201   E
# 24:   sbj05    201   E
# 25:   sbj05    201   F
# 26:   sbj05    201   F

或者,如果你只想要一个额外的列,你可以做
setDT(df)[, output := +Myfunc(ROI), by = .(subject, ntrial)]

关于R - 识别连续序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439273/

相关文章:

r - 按组选择每次运行的第一行

r - 生成序列(并在重复的情况下重新开始)并在 R 中的组内添加每个序列具有最高编号的新列

r - 如何在 PowerBI 中运行用于 ML 的 R 脚本?

r - 如何在不加载包的情况下从另一个包扩展 S3 方法

r - 洗牌向量 - 样本()的所有可能结果?

r - 创建具有指定长度的序列

r - 如何基于R中其他列中的值添加计数列

python - python中给定数字序列的常量子序列

r - 在 Sparklyr (spark_read_csv) 中指定 col 类型

r - 如何在 R 中的数据框中查找某列中字符串的最长出现次数以及另一列中对应的第一个和最后一个值?