2012-06-14 48 views
2

在我的數據框中有一個以「聲音」和「響應」作爲值的列。理想情況下,該模式是兩個聲音,然後是一個響應。但是,可能會發生三個聲音,然後是響應。如何查找並刪除R中某個數據框中列中具有相同連續值的特定行數的行?

我該如何告訴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
cumsum(rle(df$V3)$lengths)[rle(df$V3)$lengths == 3] 
[1] 6 

這將返回位置的向量,其中「聲音」連續排在第三位。現在您可以輕鬆刪除它們或製作一些列來標記這些位置。

+0

感謝,這是一個巧妙的解決辦法! – kat

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 
+0

謝謝馬克,我也會接受你的回答,但我想我只能接受1個答案。所以我也使用了你的代碼,因爲我可以很容易地調整它來檢測我的數據中的一些其他模式,這也是我將要拋出的。 – kat

相關問題