2

在我的数据框中,有一列以“声音”和“响应”为值。理想情况下,模式是两个声音后跟一个响应。但是,可能会出现三个声音后跟一个响应。

每当它在我的数据中发现这种模式时,我如何告诉 R 提出一个标志?在删除第三个声音行之前,我需要单独查看每个案例。

>df <- data.frame(V1=rep("SN", 7),  
             V3=c("Sound", "Sound", "Response", "Sound", "Sound", "Sound", "Response"), 
             V4=c("XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", "ZYXc01i35", 100), 
             stringsAsFactors=FALSE) 

V1       V3        V4
SN    Sound XYZc02i03
SN    Sound XYZq02i03
SN Response       200
SN    Sound ZYXc01i30
SN    Sound ZYXq01i30
SN    Sound ZYXc01i35
SN Response       100     

因此,在找到三个连续的声音并删除其中的最后一个(即,在以下响应之前的那个)之后,我应该有这样的所需模式:

V1       V3        V4
SN    Sound XYZc02i03
SN    Sound XYZq02i03
SN Response       200
SN    Sound ZYXc01i30
SN    Sound ZYXq01i30
SN Response       100  

很抱歉,我一直在发布这些基本问题。一如既往,非常感谢任何想法!

4

2 回答 2

4
cumsum(rle(df$V3)$lengths)[rle(df$V3)$lengths == 3]
[1] 6

这将返回“声音”连续第三个位置的向量。现在您可以轻松地删除它们或制作一些列来标记这些位置。

于 2012-06-14T17:53:27.263 回答
2

我认为这会起作用,尽管可能有更简单的解决方案:

df <- data.frame(V1=rep("SN", 7),  
             V3=c("Sound", "Sound", "Response", "Sound", "Sound", "Sound", "Response"), 
             V4=c("XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", "ZYXc01i35", 100), 
             stringsAsFactors=FALSE)

df

my.run <- rep(0,dim(df)[1])

if(df$V3[1]=='Sound') (my.run[1] = 1) else my.run[1] = 0

for (i in 2:dim(df)[1]) {

     if(df$V3[i]=='Sound') (my.run[i] = my.run[i-1] + 1) else my.run[i] = 0

}

df2 <- df[my.run < 3,]
df2
于 2012-06-14T17:54:22.793 回答