Преобразование строк в столбцы в 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 в виде тенденций для этих значений, которые помечены уникальным идентификатором, какой код я должен написать


person rajan kapoor    schedule 20.08.2020    source источник
comment
Привет и добро пожаловать в SO :) Чтобы мы могли вам помочь, предоставьте воспроизводимый пример. Например, чтобы создать минимальный набор данных, вы можете использовать head(), subset(). Затем используйте dput(), чтобы дать нам что-то, что можно немедленно поместить в R. В качестве альтернативы вы можете использовать базовые наборы данных R, такие как mtcars, iris, и т. д.. Кроме того, не могли бы вы прислать то, что вы уже пробовали?   -  person Paul    schedule 20.08.2020
comment
кажется, по крайней мере, из вашего заголовка, что вы хотите использовать сводную таблицу. возможно, это может вам помочь: rstudio-conf-2020. github.io/r-for-excel/pivot-tables.html   -  person D.J    schedule 20.08.2020


Ответы (1)


Есть много способов построить эти данные, как вы описываете. Это может быть не то, что вы ищете, поэтому, пожалуйста, будьте более конкретными, если вам нужно что-то еще.

Сначала мы начнем с ваших данных в том формате, в котором они были представлены:

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), Date = structure(c(1L, 
3L, 5L, 2L, 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, 11L, 12L), parameter2 = c(11L, 
    13L, 15L, 16L, 12L, 12L, 14L), parameter3 = c(12L, 14L, 14L, 
    15L, 18L, 13L, 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 грани, по одной для каждого идентификатора. Они будут содержать точки данных из каждого идентификатора, причем каждый параметр окрашен по-разному. Затем мы нарисуем наиболее подходящую прямую линию, используя 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))

Создана 20 августа 2020 г. с помощью пакета reprex (v0.3.0)

person Allan Cameron    schedule 20.08.2020