在ggplot2中绘制数据框的列表

时间:2018-12-05 10:24:02

标签: r dataframe ggplot2 data.table

我有一个data.table /数据框架,其中列表作为值。我想用一个盒子或小提琴来绘制这些值,一个小提琴/盒子代表我的数据集的一行,但是我不知道怎么做。

示例:

test.dt <- data.table(id = c('a','b','c'), v1 = list(c(1,0,10),1:5,3))
ggplot(data = test.dt, aes(x = as.factor(id), y = v1)) + geom_boxplot()

我收到以下消息:

  

警告信息:   stat_boxplot()中的计算失败:   'x'必须是原子

所以我的猜测是,也许我应该以某种方式将值列表拆分为行。即:以 a id 的行将被转换为具有相同ID的3行(与 v1 中的向量长度相对应) ,但值会在其中分割。

首先,我不知道如何转换如上所述的data.table,其次,我也不知道这是否完全可以解决问题。

2 个答案:

答案 0 :(得分:2)

实际上,您需要unnest绘制数据集:

library(tidyverse)

unnest(test.dt) %>% 
ggplot(data = ., aes(x = as.factor(id), y = v1)) + geom_boxplot()

答案 1 :(得分:1)

我相信您正在寻找的是非常方便的unnest()函数。以下代码有效:

library(data.table)
library(tidyverse)

test.dt <- data.table(id = c('a','b','c'), v1 = list(c(1,0,10),1:5,3))
test.dt = test.dt %>% unnest()

ggplot(test.dt, aes(x = as.factor(id), y = v1)) + 
  geom_boxplot()

如果您不想导入整个tidyverse,则unnest()函数来自 tidyr 包。

这是unnest()对示例数据的作用:

> data.table(id = c('a','b','c'), v1 = list(c(1,0,10),1:5,3))
   id        v1
1:  a   1, 0,10
2:  b 1,2,3,4,5
3:  c         3
> data.table(id = c('a','b','c'), v1 = list(c(1,0,10),1:5,3)) %>% unnest()
   id v1
1:  a  1
2:  a  0
3:  a 10
4:  b  1
5:  b  2
6:  b  3
7:  b  4
8:  b  5
9:  c  3