如何在R中的数据帧的列中查找和删除具有相同连续值的特定行数?

时间:2012-06-14 17:14:17

标签: r dataframe

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

如果在我的数据中找到此模式,我如何告诉R引发标志?在删除第三个Sound-row之前,我需要单独查看每个案例。

>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  

对不起,我一直在发布这些基本问题。任何想法一如既往地非常感谢!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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