我有一个很长的数据集,其中不同的受试者(用subj_id
标识)注意到了由连续变量Trial_Nr
标识的不同刺激。我想确定Trial_Nr
序列被破坏的对象,以及破坏发生的地方。
这是一个MWE:
df <- structure(list(Crowdsourcing_SubjId = c("5e42fc295135b5000cd20d0b",
"5e42fc295135b5000cd20d0b", "5e42fc295135b5000cd20d0b", "5e42fc295135b5000cd20d0b",
"5e42fc295135b5000cd20d0b", "5e42fc295135b5000cd20d0b", "63bd9ac0dc52225142c5b1d4",
"63bd9ac0dc52225142c5b1d4", "63bd9ac0dc52225142c5b1d4", "63bd9ac0dc52225142c5b1d4"
), Trial_Nr = c(1:6, 1, 2, 5, 6)), row.names = c(NA, 10L), class = "data.frame")
我发现了一些使用diff()
的其他帖子,但由于某种原因,我无法按组使用它:
library(tidyverse)
df %>%
group_by(Crowsourcing_SubjId) %>%
summarise(flag = diff(Trial_Nr))
执行上述操作只会给予所有主题的行间差异,而不进行分组,也无法识别中断发生的位置。
下面是我想要得到的输出:
Crowdsourcing_SubjId flag disruption
5e42fc295135b5000cd20d0b 1 NA
63bd9ac0dc52225142c5b1d4 3 2
2条答案
按热度按时间wwwo4jvm1#
用于创建数据框而不是
list
的数据:这将
flag
定义为按组连续值之间的最大差值,disruption
定义为按组连续差值第一次大于1的位置。kd3sttzy2#
使用
diff
是一个很好的开始,但你必须走得更远。您需要的是组中的连续行以1分隔。所以你需要将diffing的结果与1进行比较。这里使用
data.table
包是一个部分解决方案。结果如下
与您所期望的略有不同。当没有中断时,返回的标志将是
NA
而不是1
。