如何在将嵌套列表转换为data.frame列表后获取堆栈条形图?

时间:2016-12-15 14:20:57

标签: r dataframe ggplot2 tidyr

我有data.frame列表需要分类到不同的集合中。我发现了一些关于如何操作data.frame列表的帖子。但是,我尝试在SO中使用soluion,并且无法使用ggplot2生成堆栈条形图。我已经阅读了ggplot2包的插图,了解了如何使用基本功能。这些点,当我试图通过其pos.score列拆分列表中的每个data.frame时,结果将是嵌套列表。使用R中的嵌套列表是不可取的。是否有更简单有效的方法可以更优雅地对列表中的data.frame进行分类?如何在拆分data.frame后为文件栏创建堆栈条形图(我的意思是,对于我指定的每个data.frame对象)?如何为ggplot函数提供绘图数据?有没有有效的方法来做到这一点?这是我的第一篇文章,所以如果我的问题弄错了,请提醒我。非常感谢。

模拟数据:

dfList <- list(
  hotan = data.frame( begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)),
  aksu = data.frame( begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)),
  korla = data.frame( begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45))
)

对data.frame进行分类

catg <- lapply(myList, function(elm) {
  res <- split(elm, ifelse(elm$pos.score >=16, "valid", "invalid"))
})
这样做,我得到了嵌套列表,无法生成条形图。我正在寻求更优雅的解决方案,例如使用tidyr包。我很擅长使用这些软件包。我怎样才能实现呢?有什么好主意吗?

这是摆脱嵌套列表的讨厌方式,那有什么美妙的解决方案吗?

unlist(lapply(catg, unlist))

修改

我打算获取data.frame列表,如下所示:

$hotan.valid
$hotan.invalid
$aksu.valid
$aksu.invalid
$korla.valid
$korla.invalid

然后为文件栏(每个data.frame)生成堆栈条形图。我怎样才能轻松实现这一目标?这是所需条形图的模型:

desired stack bar plot

我在删除嵌套列表后遇到了如何生成堆栈条形图的问题。如何实现文件栏所需的堆栈条形图?如何更轻松地对列表中的每个data.frame进行分类?

1 个答案:

答案 0 :(得分:1)

以下是使用dplyr(和ggplot2)的一种方式:

编辑:以下是使用dfList包处理plyr的方法:

dfList <- list(
    hotan = data.frame( begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)),
    aksu = data.frame( begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)),
    korla = data.frame( begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45))
)

df <- ldply(dfList)

library(dplyr)
library(ggplot2)
library(plyr)

df_plot <-
    df %>% 
    mutate(valid = factor(ifelse(pos.score >= 16, 1, 0))) %>%  # if pos.score is greater than or equal to 16, valid = 1, else, valid = 0
    count(.id, valid) 

ggplot(df_plot, aes(x = .id, y = n, fill = valid)) +
    geom_col(position = "dodge")

ggsave("group_valid.png", width = 4, height = 4)

关键是将所有数据放入一个data.frame,然后count将变量groupvalid的观察频率放在一起。

ggplot-output