2016-03-06 77 views
0

我有几个日志文件,我读入一个long data.frame(日志文件1,然后是日志文件2等)。什么样的变化看起来就像演示:从数据框中选择第i行和第i + 1行

Event.Type 
Picture 
Response 
Picture 
Response 
Response 
Response 
Picture 
Response 
Response 

换句话说,该模式是一个Picture到一个或多个Response秒。我现在的目标是要提取每个图片其次第一响应,即:

Picture 
Response 
Picture 
Response 
... 

我最成功的尝试,到目前为止是提取所有图片:

picrows <- which(bps$Event.Type=="Picture") 
output <- bps[picrows,] 
write.table(output, file='bps.tab') 

后,我试图用循环添加每行后面的行,这似乎并没有工作:

i=1 
for (i in 1:length(bps)) 
    { 
    picrows[i] <- which(bps$Event.Type=="Picture") 
    output <- rbind(bps[picrows[i],], bps[picrows[i+1],]) 
    write.table(output, file='bps.tab') 
    i = i+1 
    } 
output 

这花了第一个图片行,并添加了一个看似随机的其他图片行,即两行。我的思维在哪里出错?除了循环显然不是最优雅的方式继续R.

非常感谢!

回答

2

你可以像下面这样做(而不需要循环):

# get indices of pictures: 
i <- which(d$Event.Type == "Picture") 
# subset rows in i and i+1: 
d[sort(c(i, i+1)),, drop =FALSE] 
# Event.Type 
#1 Picture 
#2 Response 
#3 Picture 
#4 Response 
#7 Picture 
#8 Response 

您可以查看发生了什么,当你运行这些线一步一步:

i 
#[1] 1 3 7 
i+1 
#[1] 2 4 8 
c(i, i+1) 
#[1] 1 3 7 2 4 8 
sort(c(i, i+1)) 
#[1] 1 2 3 4 7 8 

样品可重现形式的数据:

d <- structure(list(Event.Type = structure(c(1L, 2L, 1L, 2L, 2L, 2L, 
1L, 2L, 2L), .Label = c("Picture", "Response"), class = "factor")), .Names = "Event.Type", class = "data.frame", row.names = c(NA, 
-9L)) 

我会用d2作为设置第二个例子数据,其中S没有直接后跟一个“响应”的“图片”之一:

d2 <- d[-2, , drop=FALSE] 

一)如果你不能确定是否每个“图片”之后至少1“响应”,你可以做以下,以避免返回一些照片多次(但无论返回所有图片的“响应”,他们是否遵循):

i <- which(d2$Event.Type == "Picture") 
ii <- c(i, intersect(i+1, which(d2$Event.Type == "Response"))) 
d2[sort(ii),, drop =FALSE] 
# Event.Type 
#1 Picture 
#3 Picture 
#4 Response 
#7 Picture 
#8 Response 

b )如果你只想要回“图片”,这之后是至少1“响应”,可以使用以下修改的那些行:

i <- which(d2$Event.Type == "Picture") 
ii <- c(i, i+1)[d2$Event.Type[i+1] == "Response"] 
d2[sort(ii),, drop =FALSE] 
# Event.Type 
#3 Picture 
#4 Response 
#7 Picture 
#8 Response 
+0

非常感谢!这工作就像一个魅力!我还有一个(相关的)问题,希望可以在这里发表评论。某些图片行没有相应的响应;通过编程它在输出中出现三个连续的图像行(例如图1(i),图2之后(i + 1)和图2再次(新i))。关于如何避免这种情况的任何想法? 非常感谢您的非常详尽的答案! – Psydes

+0

@Psydes,请再次确认(次要更正) –

+1

精彩,非常感谢!如果你曾经在柏林,一罐自制酸辣酱已经得到你的名字! – Psydes

0

两个想法浮现在脑海中对我说:

  • rbind:如果您想要继续将行附加到输出var,请将其作为第一个参数。

    output <- rbind(output, bps[picrows[i],], bps[picrows[i+1],])

  • picrows只会有图片排索引。也许你想+ 1到原来的picrows [I]在下面,而不是第[i + 1]:

    output <- rbind(output, bps[picrows[i],], bps[picrows[i]+1,])

祝你好运!

+0

谢谢丹尼尔! – Psydes