リストを値として持つdata.table /データフレームがあります。値のボックスまたはバイオリン図を作成したいのですが、1つのバイオリン/ボックスがデータセットの1つの行を表していますが、その方法がわかりません。
例:
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'はアトミックである必要があります
だから私の推測では、値のリストを何らかの方法で行に分割する必要があるかもしれません。つまり、IDがasの行は、同じIDの3行(v1のベクトルの長さに対応)に変換されますが、値はそれらの間で分割されます。
まず、前述のようにdata.tableを変換する方法がわかりません。次に、これが解決策になるかどうかもわかりません。
あなたが探しているのはとても便利な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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加