删除符合特定模式的数据帧的一组相邻行-R

删除符合特定模式的数据帧的一组相邻行-R,r,indexing,pattern-matching,one-to-many,R,Indexing,Pattern Matching,One To Many,我在12月19日发布了这个问题。我收到了一个非常有用的回复,但不是我想要的。然后,有三个人提出了这个问题,他们认为这个问题需要更多的关注。指示表明我可以更新问题或发布新的,但在编辑后,使其更加集中,它仍然关闭。所以,我再次发布它 以下是编辑问题的链接,包括一个更简洁的数据集(这是一个关键评论): 但是,如果不允许该链接,内容如下: 我需要在数据中删除一组特定的行。在我们的调查(自动电话调查)中,调查工具将在通话期间尝试三次,以提示受访者输入回复。问题暂停三次后,调查工具挂断。这通常发生在电话转到

我在12月19日发布了这个问题。我收到了一个非常有用的回复,但不是我想要的。然后,有三个人提出了这个问题,他们认为这个问题需要更多的关注。指示表明我可以更新问题或发布新的,但在编辑后,使其更加集中,它仍然关闭。所以,我再次发布它

以下是编辑问题的链接,包括一个更简洁的数据集(这是一个关键评论):

但是,如果不允许该链接,内容如下:

我需要在数据中删除一组特定的行。在我们的调查(自动电话调查)中,调查工具将在通话期间尝试三次,以提示受访者输入回复。问题暂停三次后,调查工具挂断。这通常发生在电话转到某人的语音信箱时

我想在这种情况发生时确定这种模式,以便将其从计算通话时间中删除

我要查找的模式在“交互”列中如下所示:

不必是介绍。它可以是调查的任何一部分,在该部分中,它三次提示被调查者作出回应,但没有提供回应,因此呼叫失败。但是,它确实必须夹在“应答”(电话接听)和“超时。呼叫失败”(失败)之间

我确实试着将我从昨天的解决方案(关于运行长度编码)中学到的知识应用到我的另一个索引问题上,但我一点也不能让它起作用。所以,我来了

以下是一个示例数据集:

这是4名受访者以及调查工具与受访者(或其电话)之间的每次互动

以下是数据帧的代码:

鲁伊·巴拉达斯对我的回答是:

removeRows <- function(X, col = "Interaction", 
                       ans = "Answer", 
                       fail = c("Timeout. Call failed.", "Partial", "Enqueueing call"))
{  
  a <- grep(ans, X[[col]])
  f <- which(X[[col]] %in% fail)
  a <- a[findInterval(f, a)]

  for(i in seq_along(a)){
    X[[col]][a[i]:f[i]] <- NA_character_
  }
  Y <- X[complete.cases(X), , drop = FALSE]
  Y
}

removeRows(survey_data)

我通常会使用dplyr包。我确信,如果需要的话,这个方法可以修改为使用base R,但是dplyr有预先制作的函数来简化它。代码中的注释来解释它所做的事情

df2 <- df %>%
  # Find any entry where there were three timeouts evenly spaced afterwards and set TRUE.
  # You can add other conditions here if needed (to check even leading values).
  mutate(triple_timeout = ifelse(
    lead(Interaction,n=1) == "Timeout" & 
      lead(Interaction,n=3) == "Timeout" & 
      lead(Interaction,n=5) == "Timeout",
    TRUE,
    FALSE
  )) %>%
  # Lead will have some NA values so fill those in
  mutate(triple_timeout = ifelse(is.na(triple_timeout),FALSE,triple_timeout)) %>%
  # Every triple timeout has six entries that should be true, but only the first is id'd.
  # Use an `or` logic and lag statements to set value to true for 5 entries after any TRUE
  mutate(triple_timeout = triple_timeout | 
           lag(triple_timeout,n=1) |
           lag(triple_timeout,n=2) |
           lag(triple_timeout,n=3) |
           lag(triple_timeout,n=4) |
           lag(triple_timeout,n=5)
         ) %>%
  # Lag will have some NA values to fill those in
  mutate(triple_timeout = ifelse(is.na(triple_timeout),FALSE,triple_timeout)) %>%
  # Filter out any TRUE triple_filter
  filter(!triple_timeout) %>%
  # Remove the filter column
  select(-triple_timeout)
df2%
#找到任何有三个均匀间隔的超时的条目,并设置为真。
#如果需要,可以在此处添加其他条件(以检查前导值)。
变异(三重超时=ifelse(
领导(互动,n=1)=“超时”和
领导(互动,n=3)=“超时”和
lead(交互,n=5)=“超时”,
是的,
错误的
)) %>%
#铅会有一些NA值,所以请填写这些值
mutate(triple_timeout=ifelse(is.na(triple_timeout),FALSE,triple_timeout))%>%
#每个三重超时有六个应该为true的条目,但只有第一个是id。
#使用`or`逻辑和lag语句将任意true之后的5个条目的值设置为true
变异(三重超时=三重超时)
滞后(三重超时,n=1)|
滞后(三重超时,n=2)|
滞后(三重超时,n=3)|
滞后(三重超时,n=4)|
滞后(三重超时,n=5)
) %>%
#Lag将有一些NA值来填充这些值
mutate(triple_timeout=ifelse(is.na(triple_timeout),FALSE,triple_timeout))%>%
#过滤掉任何真正的三重过滤器
筛选器(!triple_timeout)%>%
#卸下过滤柱
选择(-triple_timeout)

在下个月,当我有5000名受访者的此类数据时,我会确定。但我有一只像样的公羊。再次感谢

好的,我不打开gd,请提供一些适合的数据,如果你需要使用该软件包,它不适合允许的字符空间。这必然是长数据。它只是打开一个文本编辑器,其中包含数据框的代码。谢谢!我早上第一件事就是给它打一针,然后转回来。这很有效,亚当!如果我想对一组扩展的行做类似的事情,我可以学习如何调整它。非常感谢!很高兴能帮上忙。需要注意的一点是,这种方法可能会使用相当多的内存(这在RAM有限的大型数据集上可能很重要)。但它通常很快,并且使用向量运算。