2017-10-18 107 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