gpt4 book ai didi

r - 根据列中连续值形成的模式从数据框中选择行

转载 作者:行者123 更新时间:2023-12-04 09:26:36 25 4
gpt4 key购买 nike

我的 R 平均水平,我想在以下操作方面得到一些帮助。

假设我有以下数据框:

    >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

我希望能够选择出现在变量 Label 的特定序列中的行对于每个 ID。

对于图案 "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”等)。我虚心地请求你的帮助。

编辑:我已经更新了这个问题(示例数据框和模式 "MMS" 的输出示例。我想补充一点,我希望在使用 ID 变量对数据进行分组后发生模式匹配,以便可以在按 ID 分组的数据组。抱歉第一次没有说清楚。

最终编辑:@akrun、@boski 和 @tmfmnk 的答案对我有用。与@tmfmnk 的解决方案(40 万行数据约 29 秒)相比,@boski 和 @akrun 的解决方案在执行时间上更快(40 万行数据约 2-10 秒)。我建议读者引用所有这三种解决方案。

最佳答案

一种选择是比较 lead值并获取按“ID”分组的索引

library(data.table)
i1 <- unique(setDT(df)[, lapply(which(Reduce(`&`,
Map(`==`, shift(Label, n = 0:2, type = "lead"), c("M", "M", "S")))),
function(i) .I[i:(i+2)]) , by = ID]$V1)
df[i1]
# ID Label
#1: P2 M
#2: P2 M
#3: P2 S
#4: P5 M
#5: P5 M
#6: P5 S

数据
df <- structure(list(ID = c("P1", "P1", "P2", "P2", "P2", "P3", "P3", 
"P3", "P4", "P4", "P5", "P5", "P5"), Label = c("M", "S", "M",
"M", "S", "M", "S", "M", "S", "M", "M", "M", "S")),
class = "data.frame", row.names = c(NA, -13L))

关于r - 根据列中连续值形成的模式从数据框中选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com