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

如何在将嵌套列表转换为data.frame列表后获得堆栈条形图?,r,dataframe,ggplot2,tidyr,R,Dataframe,Ggplot2,Tidyr,我有一个data.frame列表,需要分类到不同的集合中。我找到了一些关于如何操作data.frame列表的帖子。但是,我尝试在SO中使用给定的soluion,但无法使用ggplot2生成堆栈条形图。我已经阅读了ggplot2package的vignette,学习了如何使用基本功能。当我试图按列表中的pos.score列拆分每个data.frame时,结果将是嵌套列表。不需要在R中使用嵌套列表。有没有更简单有效的方法来更优雅地对列表中的data.frame进行分类?在分割data.frame之后

我有一个data.frame列表,需要分类到不同的集合中。我找到了一些关于如何操作data.frame列表的帖子。但是,我尝试在SO中使用给定的soluion,但无法使用
ggplot2
生成堆栈条形图。我已经阅读了
ggplot2
package的vignette,学习了如何使用基本功能。当我试图按列表中的
pos.score
列拆分每个data.frame时,结果将是嵌套列表。不需要在R中使用嵌套列表。有没有更简单有效的方法来更优雅地对列表中的data.frame进行分类?在分割data.frame之后,如何为文件bar(我的意思是,为我指定的每个data.frame对象)创建堆栈bar绘图?如何使绘图数据可用于
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列表,如下所示:

$hotan.valid
$hotan.invalid
$aksu.valid
$aksu.invalid
$korla.valid
$korla.invalid
然后为文件bar(每个data.frame)生成堆栈条形图。我怎样才能轻松做到这一点?这是所需条形图的实体模型:


删除嵌套列表后,如何生成堆栈条形图一直困扰着我。如何为文件栏实现所需的堆栈栏打印?如何使列表中的每个data.frame更易于分类

这里有一种使用
dplyr
(和
ggplot2
)的方法:

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

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)
dfList%#如果pos.score大于或等于16,则valid=1,否则,则valid=0
计数(.id,有效)
ggplot(df_图,aes(x=0.id,y=n,fill=valid))+
几何坐标(位置=“道奇”)
ggsave(“group_valid.png”,宽度=4,高度=4)
关键是将所有数据放入一个
data.frame
,然后
count
使用变量
group
valid
进行观察的频率


堆栈条形图的y轴是什么变量?保持dfList不变,有什么动态解决方案吗?如果dfList有更多需要分类的data.frame,那么将每个data.frame置于列表之外会怎么样呢。有没有机会让您的解决方案更具程序性?非常感谢:)刚刚添加了一个解决方案,使用了
plyr
包,这可能不可取,但应该可以很好地工作。为什么您说使用plyr包不可取?另外,我如何用其他东西更改x,y标签的名称?我怎样才能做到?感谢您,因为这是另一个包-可能有一个使用base R(甚至dplyr)的解决方案。但效果很好
$hotan.valid
$hotan.invalid
$aksu.valid
$aksu.invalid
$korla.valid
$korla.invalid
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)