2016-03-06 96 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

相關問題