最後の列がリストの列であるデータテーブルがあります。以下はその外観です。
Col1 | Col2 | ListCol
--------------------------
na | na | [obj1, obj2]
na | na | [obj1, obj2]
na | na | [obj1, obj2]
私が欲しいのは
Col1 | Col2 | Col3 | Col4
--------------------------
na | na | obj1 | obj2
na | na | obj1 | obj2
na | na | obj1 | obj2
私はすべてのリストが同じ量の要素を持っていることを知っています。
編集:
ListColのすべての要素は、2つの要素を持つリストです。
unnest
とtidyr::spread
..を使用した1つのアプローチを次に示します。
library(dplyr)
library(tidyr)
#example df
df <- tibble(a=c(1, 2, 3), b=list(c(2, 3), c(4, 5), c(6, 7)))
df %>% unnest(b) %>%
group_by(a) %>%
mutate(col=seq_along(a)) %>% #add a column indicator
spread(key=col, value=b)
a `1` `2`
<dbl> <dbl> <dbl>
1 1. 2. 3.
2 2. 4. 5.
3 3. 6. 7.
data.table
とbase::unlist
のオプションは次のとおりです。
library(data.table)
DT <- data.table(a = list(1, 2, 3),
b = list(list(1, 2),
list(2, 1),
list(1, 1)))
for (i in 1:nrow(DT)) {
set(
DT,
i = i,
j = c('b1', 'b2'),
value = unlist(DT[i][['b']], recursive = FALSE)
)
}
DT
これには、すべての行にforループが必要です...理想的ではなく、very anti-data.table
。そもそもリスト列の作成を回避する方法があるのだろうか...