2017-10-18 114 views
0

我有4個變量,看起來像一個數據:顯示正確的標籤不同的變量

id|name|year|value| 
1 A 16 500 
1 A 15 400 
1 A 14 430 
2 B 16 200 
2 B 15 180 
2 B 14 170 
3 A 16 620 
3 A 15 510 
3 A 14 200 

,然後,我在ggplot創建用於每個ID的時間線圖表,但是示出了它的標籤而不是其ID。我所做的是:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$id) 

,但它顯示的圖表寫自己的ID,而不是他們的名字,所以我嘗試:

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~db$name) 

它創造了折線圖中,其正確的標籤,但是ID 1和id 3都具有相同的名稱,所以最後它只創建了2個圖表而不是3個,其中一個圖表有6個觀察值而不是3個。

是否有方法將名稱與ID連接起來?然後通過id串聯糾正名稱。

+0

如果您提供一個[完整的最小可重現示例](http://stackoverflow.com/help/mcve)來解決您的問題,我們將更有可能幫助您。我們可以從中學習並使用它來向您展示如何回答您的問題。 –

+0

好吧,我剛剛展示的是最小的,完整的和可驗證的。 – gustavomoty

+1

請參閱'?labeller'中的示例:「_#或使用字符向量作爲查找表:_」。例如。 'lab < - c(「1」=「A」,「2」=「B」,「3」=「A」)'; 'facet_wrap(〜id,labeller = labeller(id = lab))' – Henrik

回答

0

更新:

創建一個聯合nameid列在新的一行稱爲name2id,然後圖。

db$name2 <- paste(db$name,db$id,sep="\n") 

ggplot(db, aes(x=year, y= value)) + geom_line() + facet_wrap(~name2) 

enter image description here

你可以這樣說:

ggplot(db, aes(x=year, y= value)) + 
    geom_line() + 
    facet_wrap(~interaction(id, name)) 

它創建了名稱和ID的每個組合單獨的圖表。如果您想排除1.2.,我們必須調整解決方案。

數據:

db <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), name = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), .Label = c("A", "B"), class = "factor"), 
    year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L), value = c(500L, 
    400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)), .Names = c("id", 
"name", "year", "value"), class = "data.frame", row.names = c(NA, 
-9L)) 
+0

它工作完美!但是,放棄.1和.2會很好。 – gustavomoty

+0

或者如果我們用兩行代碼製作標籤,因爲在某些情況下,我實際上沒有這些ID和名稱,但是ID和名稱更大。所以,如果我們把名字放在第一行,跳過,然後在第二行的id,將是一個完美的場景。 – gustavomoty

+0

@gustavomoty看到我的更新! – Mako212

0

Marko212's answer肯定是更好了。但是,如果您需要將nameid在未來某個點連接起來。

dta <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), 
     name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L), 
     .Label = c("A", "B"), class = "factor"), 
     year = c(16L, 15L, 14L, 16L, 15L, 14L, 16L, 15L, 14L), 
     value = c(500L, 400L, 430L, 200L, 180L, 170L, 620L, 510L, 200L)), 
     .Names = c("id", "name", "year", "value"), 
     class = "data.frame", row.names = c(NA, -9L)) 

dta$name_id <- with(dta, paste0(id, name)) 
dta 
#> id name year value name_id 
#> 1 1 A 16 500  1A 
#> 2 1 A 15 400  1A 
#> 3 1 A 14 430  1A 
#> 4 2 B 16 200  2B 
#> 5 2 B 15 180  2B 
#> 6 2 B 14 170  2B 
#> 7 3 A 16 620  3A 
#> 8 3 A 15 510  3A 
#> 9 3 A 14 200  3A