标识单列的多个相邻行中的特定模式-R

时间:2019-12-19 23:06:27

标签: r indexing pattern-matching one-to-many

我回来了我的调查数据。

这次,我需要从数据中删除一组特定的行。在我们的调查(自动电话调查)中,调查工具将在呼叫期间尝试三次,以提示被调查者输入答复。问题三个超时后,调查工具挂断。当呼叫转到某人的语音信箱时,通常会发生这种情况。

我想在发生这种情况时对其进行识别,以便将其从计算通话时间中删除。

这是一个示例数据集:

这是15位受访者,调查工具与受访者(实质上是他们的电话)之间的每次互动。

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

Example pattern

不必介绍。它可以是调查中提示被调查者作出答复的任何部分。但是,必须将其夹在“答案”和“超时。呼叫失败”之间。 (失败),或者在“答案”和“部分”之间(有人停止响应),或者在“答案”和“入队”之间(我们将调查中断,然后将它们分类为完全或部分)。

这是另一个:

Another example pattern

我确实尝试将从昨天的解决方案(关于游程长度编码)中学到的知识应用于我的其他索引问题,但是我无法使它丝毫起作用。所以,我在这里。

以下是数据框的代码:This goes to a Google Drive text editor with the code

1 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,则下面的函数将删除带有"Answer"的行和失败值(问题中有3个这样的值)之间的所有行。
要查找默认值的列名称为"Interactions",并且第一个答案和失败值也分配了默认值。
请注意,所有匹配指令都区分大小写。

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)