【问题标题】:R Create multiple time series line graphs, grouped by a separate datasetR 创建多个时间序列折线图,按单独的数据集分组
【发布时间】:2020-08-14 13:55:26
【问题描述】:

我有一个这样的数据集,我使用时间序列聚类将它变成了一个巨大的树状图:

DF<-structure(list(`Smith, Sumner` = c(" 0", " 0", " 0", " 0", " 0", 
                                    " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", 
                                    "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", 
                                    "  0", "  0", "  1", "  1", "  1", "  1", "  2", "  3", "  7", 
                                    " 15", " 22", " 25", " 31", " 32", " 40", " 41", " 45", " 47", 
                                    " 48", " 48", " 49", " 49", " 49", " 49", " 49", " 49"), `Fizzle III, Joseph` = c(" 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", 
                                                                                                                     " 0", " 0", " 0", " 0", "  0", "  0", "  0", "  0", "  0", "  0", 
                                                                                                                     "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", 
                                                                                                                     "  5", "  6", "  7", "  9", "  9", " 11", " 21", " 25", " 33", 
                                                                                                                     " 38", " 44", " 51", " 54", " 57", " 60", " 61", " 67", " 72", 
                                                                                                                     " 73", " 73"), `johnson, Barry` = c(" 0", " 0", " 0", " 0", " 0", 
                                                                                                                                                      " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", 
                                                                                                                                                      "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", 
                                                                                                                                                      "  0", "  0", "  0", "  0", "  0", "  0", "  1", "  5", "  7", 
                                                                                                                                                      " 11", " 12", " 17", " 20", " 21", " 24", " 25", " 28", " 28", 
                                                                                                                                                      " 28", " 28", " 28", " 31", " 31", " 33", " 33", " 33"), `peanut, Mark` = c(" 0", 
                                                                                                                                                                                                                                   " 0", " 0", " 0", " 0", " 0", " 0", " 1", " 2", " 5", "10", "18", 
                                                                                                                                                                                                                                   "22", "23", "27", "28", " 30", " 34", " 42", " 44", " 48", " 51", 
                                                                                                                                                                                                                                   " 62", " 64", " 65", " 66", " 67", " 68", " 73", " 75", " 76", 
                                                                                                                                                                                                                                   " 81", " 86", " 89", " 89", " 92", " 94", "102", "111", "118", 
                                                                                                                                                                                                                                   "133", "141", "146", "157", "158", "158", "158", "158", "158", 
                                                                                                                                                                                                                                   "158", "158"), `alpha, John A` = c(" 0", " 0", " 0", " 0", 
                                                                                                                                                                                                                                                                        " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", 
                                                                                                                                                                                                                                                                        " 0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", "  0", 
                                                                                                                                                                                                                                                                        "  0", "  0", "  6", " 11", " 13", " 15", " 17", " 20", " 31", 
                                                                                                                                                                                                                                                                        " 35", " 41", " 46", " 53", " 59", " 69", " 87", " 91", " 93", 
                                                                                                                                                                                                                                                                        "103", "127", "133", "133", "133", "133", "133", "133", "133"
                                                                                                                                                                                                                                   ), `barry, Lloyd Alan` = c(" 0", " 0", " 0", " 1", " 2", " 2", 
                                                                                                                                                                                                                                                                " 3", " 3", " 3", " 3", " 3", " 5", " 7", "11", "13", "18", " 23", 
                                                                                                                                                                                                                                                                " 23", " 23", " 27", " 28", " 31", " 32", " 32", " 33", " 33", 
                                                                                                                                                                                                                                                                " 33", " 33", " 33", " 33", " 33", " 33", " 33", " 33", " 33", 
                                                                                                                                                                                                                                                                " 33", " 33", " 33", " 33", " 33", " 33", " 33", " 33", " 33", 
                                                                                                                                                                                                                                                                " 33", " 33", " 33", " 33", " 33", " 33", " 33"), `smith, EK` = c(" 0", 
                                                                                                                                                                                                                                                                                                                                    " 0", " 2", " 3", " 3", " 3", " 4", " 6", " 6", " 6", " 6", " 6", 
                                                                                                                                                                                                                                                                                                                                    " 6", " 7", "14", "15", " 18", " 25", " 28", " 29", " 33", " 37", 
                                                                                                                                                                                                                                                                                                                                    " 45", " 49", " 51", " 54", " 61", " 65", " 65", " 70", " 75", 
                                                                                                                                                                                                                                                                                                                                    " 79", " 79", " 81", " 82", " 83", " 87", " 89", " 89", " 91", 
                                                                                                                                                                                                                                                                                                                                    " 91", " 91", " 91", " 93", " 95", " 95", " 98", " 98", " 99", 
                                                                                                                                                                                                                                                                                                                                    "100", "100"), `parvin, Eric David` = c(" 0", " 0", " 0", " 0", 
                                                                                                                                                                                                                                                                                                                                                                            " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", " 0", 
                                                                                                                                                                                                                                                                                                                                                                            " 0", "  0", "  4", "  6", "  6", "  6", "  6", "  6", "  6", 
                                                                                                                                                                                                                                                                                                                                                                            "  6", "  6", "  6", "  6", "  6", "  6", "  7", "  7", "  9", 
                                                                                                                                                                                                                                                                                                                                                                            " 10", " 10", " 10", " 10", " 10", " 10", " 10", " 10", " 10", 
                                                                                                                                                                                                                                                                                                                                                                            " 10", " 10", " 10", " 10", " 10", " 10", " 10", " 10", " 10"
                                                                                                                                                                                                                                                                                                                                    ), `Burgess, Gary` = c(" 0", " 0", " 0", " 1", " 1", " 1", 
                                                                                                                                                                                                                                                                                                                                                                 " 1", " 1", " 1", " 1", " 1", " 1", " 1", " 1", " 1", " 3", "  5", 
                                                                                                                                                                                                                                                                                                                                                                 "  5", "  5", "  6", "  7", "  7", "  8", "  8", "  8", "  9", 
                                                                                                                                                                                                                                                                                                                                                                 "  9", "  9", "  9", " 11", " 11", " 11", " 11", " 12", " 12", 
                                                                                                                                                                                                                                                                                                                                                                 " 14", " 14", " 15", " 15", " 17", " 17", " 17", " 18", " 18", 
                                                                                                                                                                                                                                                                                                                                                                 " 18", " 18", " 18", " 18", " 18", " 18", " 18"), `smith, john` = c(" 0", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 0", " 0", " 0", " 1", " 1", " 3", " 6", " 6", " 6", " 8", " 8", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 8", " 8", " 8", " 8", "  8", "  8", "  8", "  9", " 10", " 11", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 13", " 14", " 16", " 16", " 17", " 18", " 18", " 19", " 20", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 20", " 20", " 21", " 21", " 22", " 22", " 22", " 22", " 22", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 22", " 22", " 22", " 22", " 22", " 22", " 22", " 22", " 22", 
                                                                                                                                                                                                                                                                                                                                                                                                                                            " 22", " 22")), row.names = c(NA, -51L), class = c("tbl_df", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "tbl", "data.frame"))

附:任何人都知道为什么当我从 RStudio 复制时它会如此奇怪地粘贴?有巨大的空间?

无论如何,在数据中,每一列都是一个人(名字应该打乱),行代表年份,每年发生一定数量的事件。我使用时间序列聚类与真实数据集(数百列)来创建将最相似的列组合在一起的树状图。我可以在如下所示的数据框中访问该分组:

DF2<-structure(list(type_col = c("Smith, Sumner", "josephs, Joseph", 
"smith, Barry", "johnson, Mark", "Peanut, John A", "smithy, Lloyd Alan", 
"john, EK", "Amistad, Eric David", "Hotdog, Gary ", "Jones, SMith"
), cluster_group = c(1L, 2L, 2L, 1L, 3L, 3L, 1L, 1L, 2L, 1L)), row.names = c(NA, 
10L), class = "data.frame")

所以这向我显示了名称(我很抱歉这些名称与其他示例数据中显示的名称不完全相同)及其各自的组。

我想做的就是绘制这样的图(忽略“90 年代”和“80 年代”,上面写着 A 或 B,我希望分别是第 1 组或第 2 组)

我会在哪里获取每个相应的组,然后“平均”他们的数据以随着时间的推移为每个组创建一条线。那有意义吗?我知道 ggplot 可以使用“分组”变量,而且我也知道多个 geom_lines 可以在一个图形上,但除此之外我完全迷失了。救命!

【问题讨论】:

  • 您想要的只是DF2 中的名称的绘图,并避免所有介于 80 和 90 之间的值?
  • 对不起,80 和 90 与我的问题无关(恰好在我用作示例的照片中,我应该使用更好的照片)。我特别想要的是:假设我知道(基于 DF2)barry smith 和 joseph josephs 属于同一组(比如说 group2)。因此,根据 DF 中的信息,它将为这些人取两列,然后平均他们在每一行中的内容。每行的这个新平均值将是 group2 的图表。它将为每个组执行此操作。因此,该图将为每个组提供一条线。这有意义吗?
  • 而DF2 中没有模糊含义的DF 的名称是仅一组还是一组或其他?
  • 我应该花时间研究这些名字。实际上,DF 和 DF2 之间的名称绝对总是匹配的,DF2 是从 DF 生成的。看起来它们可能并不总是匹配的原因是我匆忙把它放在这里,为了匿名,我手动更改了名称,并且没有做好。对不起

标签: r ggplot2 time-series


【解决方案1】:

这主要是一个数据重塑问题。先转换DFfrom wide to long format,再与DF2合并,按时间分组汇总。最后,绘制结果。

为了在DF 和DF2 中有匹配的名称,我更改了发布的数据。

library(tidyverse)

DF[] <- lapply(DF, function(x) as.numeric(as.character(x)))
names(DF) <- LETTERS[seq_len(ncol(DF))]

DF2$type_col <- LETTERS[seq_len(ncol(DF))]

DF %>%
  rownames_to_column(var = "time") %>%
  mutate(time = as.integer(time)) %>%
  pivot_longer(
    cols = -time,
    names_to = "type_col",
    values_to = "Value"
  ) %>%
  left_join(DF2, by = "type_col") %>%
  mutate(cluster_group = factor(cluster_group)) %>%
  group_by(time, cluster_group) %>%
  summarise(Mean = mean(Value, na.rm = TRUE), .groups = "drop_last") %>%
  ggplot(aes(time, Mean, color = cluster_group)) +
  geom_line()

【讨论】:

  • 效果很好!用我的真实数据。奇怪的是它不能处理我几乎相同的一组不同的数据。与其将所有内容粘贴到此线程中,有没有一种方法可以直接向您发送指向我在 Rstudio 云上的链接,您可以看看吗?显示“.subset2(chunks, self$get_current_group()) 中的错误:尝试在 integerOneIndex 中选择少于一个元素”的奇怪错误
  • @JoeCrozier 如果需要,您可以粘贴指向数据的链接。同时,Run ``rlang::last_error()`` to see where the error occurred. 可能会从 summarise 中删除 .groups 参数
  • 我很犹豫是否发布链接供大家查看,但我可以提供一些详细信息,如果其他人运行此链接,也许会对他们有所帮助。因此,如果我运行: "DF %>% rownames_to_column(var = "time")" 一切正常,但第二个我添加下一行: "DF %>% rownames_to_column(var = "time") %>% mutate( time = as.integer(time))" 我得到了错误。当我直观地查看时间变量(如果我将其分配为数据框)时,它在视觉上看起来与使用有效数据运行它时没有任何不同。时间列从1到41,看起来正常吗?
  • @JoeCrozier 好的,这是一个因素吗?也许您不需要发布数据,很多时候它是私有的。将rownames_to_column 连接到str 以提供数据结构并查看其中的内容。我的意思是rownames_to_column(var = "time") %&gt;% str() 将结束管道。
  • @Rui Barradas 看起来都是 num 的,除了时间变量是字符。这与正常工作的数据集中相同。我的意思是,与运行良好的数据集并排,它看起来几乎相同。我知道这两个数据集都只是数字,并且没有丢失数据(因为它们在创建树状图时都有效),据我所知,唯一的区别是一个数据集有 51 行,一个有 41 行(那不是工作)。一个有 264 列,一个有 257 列(不起作用)
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
相关资源
最近更新 更多