将行转换为R中的列

问题描述

我有一个如下数据表:

ID    Date      parameter1 parameter2  parameter3 
1     01/01/20  10         11          12
1     03/01/20  12         13          14
1     05/01/20  11         15          14
2     02/01/20  17         16          15
2     07/01/20  14         12          18
3     04/02/20  11         12          13
3     06/02/20  12         14          16

现在,如果我必须为这些值的趋势制作一个ggplot图,并标记为唯一ID,我该写什么代码

解决方法

有许多方法可以按照您的描述来绘制此数据。这可能不是您要找的内容,因此,如果您需要其他内容,请更加具体。

首先,我们以显示的格式开始处理您的数据:

df <- structure(list(ID = c(1L,1L,2L,3L,3L),Date = structure(c(1L,5L,7L,4L,6L),.Label = c("01/01/20","02/01/20","03/01/20","04/02/20","05/01/20","06/02/20","07/01/20"),class = "factor"),parameter1 = c(10L,12L,11L,17L,14L,12L),parameter2 = c(11L,13L,15L,16L,14L),parameter3 = c(12L,18L,16L)),class = "data.frame",row.names = c(NA,-7L))

df
#>   ID     Date parameter1 parameter2 parameter3
#> 1  1 01/01/20         10         11         12
#> 2  1 03/01/20         12         13         14
#> 3  1 05/01/20         11         15         14
#> 4  2 02/01/20         17         16         15
#> 5  2 07/01/20         14         12         18
#> 6  3 04/02/20         11         12         13
#> 7  3 06/02/20         12         14         16

我们希望Date列代表实际日期(目前是字符或因子向量),因此我们用strptime进行转换:

df$Date <- as.POSIXct(strptime(df$Date,format = "%d/%m/%y",tz = "GMT"))

要将所有数据绘制在单个图表中,如果我们将其从宽格式转换为长格式,则将更加容易。我们可以使用tidyr::pivot_longer

df <- tidyr::pivot_longer(df,c("parameter1","parameter2","parameter3"))
df
#> # A tibble: 21 x 4
#>       ID Date                name       value
#>    <int> <dttm>              <chr>      <int>
#>  1     1 2020-01-01 00:00:00 parameter1    10
#>  2     1 2020-01-01 00:00:00 parameter2    11
#>  3     1 2020-01-01 00:00:00 parameter3    12
#>  4     1 2020-01-03 00:00:00 parameter1    12
#>  5     1 2020-01-03 00:00:00 parameter2    13
#>  6     1 2020-01-03 00:00:00 parameter3    14
#>  7     1 2020-01-05 00:00:00 parameter1    11
#>  8     1 2020-01-05 00:00:00 parameter2    15
#>  9     1 2020-01-05 00:00:00 parameter3    14
#> 10     2 2020-01-02 00:00:00 parameter1    17
#> # ... with 11 more rows

现在我们准备绘制。我们将生成3个方面,每个ID对应一个。这些将包含每个ID的数据点,每个参数的颜色都不同。然后,我们将使用geom_smooth绘制最合适的直线:

library(ggplot2)

ggplot(df,aes(Date,value,colour = name)) + 
  geom_point() +
  geom_smooth(method = lm,formula = y ~ x,se = FALSE,linetype = 2) +
  scale_x_datetime(date_labels = "%d-%b") +
  facet_wrap(ID~.,scales = "free_x") +
  theme(axis.text.x.bottom = element_text(angle = 45,hjust = 1))

reprex package(v0.3.0)于2020-08-20创建