在我的数据框中,有一列以“声音”和“响应”作为值。理想情况下,模式是两个声音,后跟一个响应。但是,可能会发生三个声音后跟一个响应。
如果在我的数据中找到此模式,我如何告诉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
对不起,我一直在发布这些基本问题。任何想法一如既往地非常感谢!
答案 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