web-dev-qa-db-ja.com

リスト列をRの複数の列に分割する

最後の列がリストの列であるデータテーブルがあります。以下はその外観です。

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つの要素を持つリストです。

8
Santi

unnesttidyr::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.
7
Andrew Gustar

data.tablebase::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。そもそもリスト列の作成を回避する方法があるのだろうか...

0
Alec