2016-02-15 133 views
1

我試圖通過本質上是關鍵值來繪製一些部分連續數據。下面是一個示例data.frame來說明問題。用ggplot在R中繪製不等長的離散羣體

testDf <- data.frame("x1" = c(26.7, 33.0, 23.6, 18.4, 26.7, 75.0, 52.5, 51.5, 56.1, 60.1, 57.7, 37.6, 32.1, 47.7, 65.7, 55.9, 29.6, 32.1, 26.6, 19.3), 
"y1" = c(8.1, 3.5, 4.9, 24.6, 23.6, 2.8, 95.7, 93.9, 84.5, 83.0, 94.7, 74.4, 32.5, 6.7, 5.6, 40.7, 25.6, 16.5, 13.2, 22.6), 
"x2" = c(33.0, 23.6, 18.4, 26.7, 75.0, 77.2, 51.5, 56.1, 60.1, 57.7, 37.6, 32.1, 47.7, 65.7, 77.9, 58.0, 32.1, 26.6, 19.3, 22.2), 
"y2" = c(3.5, 4.9, 24.6, 23.6, 3.3, 3.1, 93.9, 84.5, 83.0, 94.7, 74.4, 32.5, 6.7, 5.6, 3.7, 43.3, 16.5, 13.2, 22.6, 24.3), 
"event" = c(8, 1, 1, 1, 1, 44, 8, 1, 1, 11, 12, 1, 1, 1, 36, 8, 8 , 1, 1, 12)) 

所以8這裏是魔術數字。我需要從事件== 8的每一次出現開始。然後將所有的x,y對與段連接,直到下一個事件== 8(其他'事件'數字不重要,8是這些值用於過濾/重置目的)。

簡而言之,這裏有四個獨立的集合。第1到第6行是一組連接的段;第7到15行是另一組段。第16行只是一個段。然後行16到20將是另一組連接段。

Df可能看起來有點混亂,但第n行的(x2,y2)值與第n + 1行的(x1,y1)值相同(8s除外)。只有一個例外,從第5行到第6行有一個小的不連續躍變。

我試圖添加一個實際索引的列(在使用verboten'if'循環之前'rle'失敗) ,使用重塑按這些索引進行分組,然後使用ggplot製作分段。但無數次嘗試後我都無法獲得我想要的融化Df。這似乎應該會更容易,但我有點難以理解如何在傳遞給ggplot之前將它們正確分組。

感謝您的任何幫助。

+0

你能否澄清你在尋求什麼幫助(即你期望的結果是什麼)?看起來你正在尋找一種方法來創建一個適當的指示變量來傳遞給ggplot的「group」審美,但是你的最後一段讓我有點不確定它是否是你遇到的問題,或者你是否得到了在ggplot結尾的不明原因的行爲。 – Empiromancer

+0

所以下面的答案是最直接的,但你的評論也是有幫助的。我試圖使用reshape2從寬轉換爲長。但是沒有得到我需要的結果。我完全忘了ggplot中的'group'。 – noLongerRandom

回答

2

您可以通過累計總和event == 8來獲得組的指標變量。

testDf$ind <- cumsum(testDf$event == 8) 

這爲您提供以下數據幀:

 x1 y1 x2 y2 event ind 
1 26.7 8.1 33.0 3.5  8 1 
2 33.0 3.5 23.6 4.9  1 1 
3 23.6 4.9 18.4 24.6  1 1 
4 18.4 24.6 26.7 23.6  1 1 
5 26.7 23.6 75.0 3.3  1 1 
6 75.0 2.8 77.2 3.1 44 1 
7 52.5 95.7 51.5 93.9  8 2 
8 51.5 93.9 56.1 84.5  1 2 
9 56.1 84.5 60.1 83.0  1 2 
10 60.1 83.0 57.7 94.7 11 2 
11 57.7 94.7 37.6 74.4 12 2 
12 37.6 74.4 32.1 32.5  1 2 
13 32.1 32.5 47.7 6.7  1 2 
14 47.7 6.7 65.7 5.6  1 2 
15 65.7 5.6 77.9 3.7 36 2 
16 55.9 40.7 58.0 43.3  8 3 
17 29.6 25.6 32.1 16.5  8 4 
18 32.1 16.5 26.6 13.2  1 4 
19 26.6 13.2 19.3 22.6  1 4 
20 19.3 22.6 22.2 24.3 12 4 

有了這些索引列,你應該能夠使用GGPLOT2得到你正在尋找的圖形。

+0

謝謝。我以前從來沒有用過'cumsum'。箭的另一個箭頭。 – noLongerRandom