将嵌套列表转换为 data.frame 列表后如何获取堆栈条形图?
How to get stack bar plot after casting nested list to list of data.frame?
我有 data.frame 的列表需要分类到不同的集合中。我找到了一些关于如何操作 data.frame 列表的 post。但是,我在 SO 中尝试了给定的解决方案,但无法使用 ggplot2
生成堆栈条形图。我已经阅读了 ggplot2
包的小插图,了解了如何使用基本功能。要点是,当我尝试通过其 pos.score
列拆分列表中的每个 data.frame 时,结果将是嵌套列表。不需要在 R 中使用嵌套列表。有没有更简单有效的方法来更优雅地对列表中的 data.frame 进行分类?如何在拆分 data.frame 后为文件条创建堆栈条图(我的意思是,对于我指定的每个 data.frame 对象)?如何使绘图数据可用于 ggplot
函数?有什么有效的方法可以做到这一点?这是我的第一个post,所以如果我的问题有误,请提醒我。非常感谢。
模拟数据:
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 进行分类?
这是使用 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)
关键是把所有的数据都放在一个data.frame
,然后count
用变量group
和valid
.[=20=观察的频率]
我有 data.frame 的列表需要分类到不同的集合中。我找到了一些关于如何操作 data.frame 列表的 post。但是,我在 SO 中尝试了给定的解决方案,但无法使用 ggplot2
生成堆栈条形图。我已经阅读了 ggplot2
包的小插图,了解了如何使用基本功能。要点是,当我尝试通过其 pos.score
列拆分列表中的每个 data.frame 时,结果将是嵌套列表。不需要在 R 中使用嵌套列表。有没有更简单有效的方法来更优雅地对列表中的 data.frame 进行分类?如何在拆分 data.frame 后为文件条创建堆栈条图(我的意思是,对于我指定的每个 data.frame 对象)?如何使绘图数据可用于 ggplot
函数?有什么有效的方法可以做到这一点?这是我的第一个post,所以如果我的问题有误,请提醒我。非常感谢。
模拟数据:
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 进行分类?
这是使用 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)
关键是把所有的数据都放在一个data.frame
,然后count
用变量group
和valid
.[=20=观察的频率]