将不均匀列表分解为要在ggplot2中使用的数据帧

时间:2017-08-28 23:42:25

标签: r list ggplot2 dplyr tibble

我有一个巨大的各种元组列表,我通过运行for循环输出。此列表中的元素是使用count()group_by_()的结果,并显示按类别a分别在各种设施中工作和不工作的人数,但是list具有可变数量的行和一个名称不同的列。

这是我(20+元素)列表中的三个元素:

library(plyr)    
library(tidyverse)

(Hospital1 <- tibble(a = c("In.City", "In.City", "Likely Move", "Likely Move", "Possibly Move", "Unlikely Move", "Unlikely Move", NA), 
                     Something.Hospital1 = c("Hospital1", NA, "Hospital1", NA, NA, "Hospital1", NA, NA), 
                     n= c(sample(1:100, 8, replace = TRUE))))
(Hospital2 <- tibble(a = c("In.City", "In.City", "Likely Move", "Likely Move", "Possibly Move", "Unlikely Move", NA),
                     Something.Hospital2 = c("Hospital2", NA, "Hospital2", NA, NA, NA, NA), 
                     n= c(sample(1:100, 7, replace = TRUE))))
(Hospital3 <- tibble(a = c("In.City", "Likely Move", "Unlikely Move", "Possibly Move", NA),
                     Something.Hospital3 = as.character(c(NA, NA, NA, NA, NA)), 
                     n= c(sample(1:100, 5, replace = TRUE))))

#What my data actually looks like
(example.list <- list(Hospital1, Hospital2, Hospital3))

第3列中n的值不是每个列表元素第二列中NA旁边的值最重要的。到目前为止,我真的很难将这些变成ggplot2可以使用它们的形式。因为我正在使用大约20个列表元素,所以我觉得我需要在代码中使用列表结构,并且如果需要可以迭代或创建函数。我试过:

1)使用cbind(example.list[[1:3]])bind_cols([[1:3]])将它们绑定到一个tibble中,尽管两者都因为行数不同而失败(与单个括号相同)。

2)单独绘制这些元素,尽管ggplot2随列表失败。

3)使用list2env(example.list[1:3], envir = .GlobalEnv)将它们拆分为单独的数据框,但这给了我错误

names(x) must be a character vector of the same length as x

4)执行for循环left_join()但是为了这样做,我需要一个密钥,我可以使用与cumsum()类似的东西来形成密钥,但是对于字符单元格。那必须看起来像这样

              a Something.Hospital1     n match.key
          <chr>               <chr> <int> <dbl>
1       In.City           Hospital1    40     1
2       In.City                <NA>    25     2
3   Likely Move           Hospital1    17     1
4   Likely Move                <NA>    56     2
5 Possibly Move           Hospital1    59     1

5)我尝试使用ddply(output[[10]], .(crosstab, n), nrow),但V1对此类合并没有帮助。

       crosstab   n V1
1     In.Camden  14  1
2     In.Camden 139  1
3   Likely Move   4  1
4   Likely Move 171  1

在我看来,我希望我的数据看起来像这样,列出了所有可能性。然后我可以使用tidyr()将其转换为ggplot格式

             a Something.Hospital1    n1 Something.Hospital2    n2 Something.Hospital3    n3
          <chr>               <chr> <int>               <chr> <int>               <chr> <int>
1       In.City           Hospital1    39           Hospital2    24           Hospital3    13
2       In.City                <NA>    86                <NA>    82                <NA>    85
3   Likely Move           Hospital1    77           Hospital2    16           Hospital3    17
4   Likely Move                <NA>     4                <NA>    78                <NA>    49
5 Possibly Move           Hospital1   100           Hospital2    79           Hospital3    95
6 Possibly Move                <NA>    49                <NA>    31                <NA>    62
7 Unlikely Move           Hospital1    82           Hospital2     3           Hospital3    96
8 Unlikely Move                <NA>    27                <NA>    30                <NA>    39
9          <NA>                <NA>    55                <NA>    96                <NA>    47

我完全不理解lapply并且相关,所以如果你建议,请明确如何使用它们。我更喜欢dplyr,因为这是我最了解的。

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

您可以将每个tibble中的列重命名为相同的内容,这将打开绑定行的门并以长格式获取数据集,而无需稍后重新整形。

您可以使用lapplypurrr::map遍历列表,重命名每个列表元素中的列。我会在较旧的 purrr 版本中使用map_dfrmap_df),因为在循环遍历列表后,它将使用bind_rows将数据集绑定在一起。 map_dfr有一个.id参数,因此我们可以添加一列来分辨数据集。这可能在这里很有用,但可以跳过。

您可以通过 dplyr 中的rename_at更改列名称。由于您要重命名单个列,因此我会使用paste0将它们全部命名为新名称。

这里是循环遍历example.list的每个元素的代码,并重命名包含单词&#34; Hospital&#34;与&#34; Something.Hospital&#34;。

map_dfr(example.list, ~rename_at(.x, vars( contains( "Hospital") ), 
                                 funs( paste0("Something.Hospital") ) ), 
        .id = "group" )

# A tibble: 20 x 4
   group             a Something.Hospital     n
   <chr>         <chr>              <chr> <int>
 1     1       In.City          Hospital1    31
 2     1       In.City               <NA>    81
 3     1   Likely Move          Hospital1    71
 4     1   Likely Move               <NA>    87
 5     1 Possibly Move               <NA>     6
 6     1 Unlikely Move          Hospital1    16
 7     1 Unlikely Move               <NA>    16
 8     1          <NA>               <NA>    92
 9     2       In.City          Hospital2    98
...