我在R上一般,我想在下面的操作上得到一些帮助。
假设我有以下 Dataframe :
>df
ID Label
P1 M
P1 S
P2 M
P2 M
P2 S
P3 M
P3 S
P3 M
P4 S
P4 M
P5 M
P5 M
P5 S
我希望能够针对每个ID选择变量Label
的特定序列中出现的行。
对于模式"MS"
,预期输出为
ID Label
P1 M
P1 S
P2 M
P2 S
P3 M
P3 S
而对于模式"MMS"
,期望输出将是
ID Label
P2 M
P2 M
P2 S
P5 M
P5 M
P5 S
对于模式"SM"
,期望输出为:
ID Label
P3 S
P3 M
P4 S
P4 M
请考虑到我正在处理的数据有很多行,而我需要构建的解决方案需要适用于任意长度的模式。(例如,“MSS”,“SM”,“MMSSMS”等)。我谦卑地请求您的帮助。
编辑:我已经更新了这个问题(示例 Dataframe 和模式"MMS"
的输出示例。我想补充的是,我希望模式匹配发生在使用ID
变量对数据进行分组之后,以便可以在按ID
分组的数据组中找到模式。抱歉,第一次没有说清楚。
最终编辑:@akrun、@boski和@tmfmnk的答案对我很有效。与@tmfmnk的解决方案(400 k行数据约29秒)相比,@boski和@akrun的解决方案在执行时间上更快(400 k行数据约2-10秒)。我建议读者参考所有这三个解决方案。
3条答案
按热度按时间1mrurvl11#
一个选项是比较
lead
值并获取按"ID"分组的索引数据
jv2fixgn2#
您可以尝试使用
gregexpr()
。首先粘贴所有标签并找到您要查找的图案的起始位置。我以前的解决方案没有检索整个模式(只是开始)。
unftdfkk3#
原始问题的一个基本解决方案可以是:
或以
dplyr
形式编写:同时解决问题的编辑: