我有一个巨大的各种元组列表,我通过运行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,因为这是我最了解的。
非常感谢你的帮助
答案 0 :(得分:0)
您可以将每个tibble中的列重命名为相同的内容,这将打开绑定行的门并以长格式获取数据集,而无需稍后重新整形。
您可以使用lapply
或purrr::map
遍历列表,重命名每个列表元素中的列。我会在较旧的 purrr 版本中使用map_dfr
(map_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
...