我有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)生成堆栈条形图。我怎样才能轻松实现这一目标?这是所需条形图的模型:
我在删除嵌套列表后遇到了如何生成堆栈条形图的问题。如何实现文件栏所需的堆栈条形图?如何更轻松地对列表中的每个data.frame进行分类?
答案 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
将变量group
和valid
的观察频率放在一起。