データフレームのネストを解除するには、以下を使用できます。
df <- data_frame(
x = 1,
y = list(a = 1, b = 2)
)
tidyr::unnest(df)
しかし、データフレーム列内のリスト内のリストをアンネストするにはどうすればよいですか?
df <- data_frame(
x = 1,
y = list(list(a = 1, b = 2))
)
tidyr::unnest(df)
エラー:
各列は、ベクトルのリストまたはデータフレームのリストのいずれかである必要があります[y]
リストに最適なpurrr
を使用すると、
library(purrr)
df %>% dmap(unlist)
## # A tibble: 2 x 2
## x y
## <dbl> <dbl>
## 1 1 1
## 2 1 2
これは多かれ少なかれ同等です
as.data.frame(lapply(df, unlist))
## x y
## a 1 1
## b 1 2
更新:
dmap
は非推奨になり、 purrrlyr に移動しました。これは、興味深いが運命の悪い関数のホームであり、非推奨の警告がたくさん表示されます。基本のRイディオムをtidyverseに変換できます。
df %>% map(unlist) %>% as_data_frame()
これはこの場合は問題なく機能しますが、複数の行では機能しません(これらすべてのアプローチが直面する問題)。より堅牢なソリューションは、
library(tidyverse)
df %>% bind_rows(df) %>% # make larger sample data
mutate_if(is.list, simplify_all) %>% # flatten each list element internally
unnest() # expand
#> # A tibble: 4 × 2
#> x y
#> <dbl> <dbl>
#> 1 1 1
#> 2 1 2
#> 3 1 1
#> 4 1 2
これは、tidyr 1.0.0:からunnest_longer()
を使用して簡単な手順で実行できます。
df <- tibble::tibble(
x = 1,
y = list(list(a = 1, b = 2))
)
library(tidyr)
unnest_longer(df,y,indices_include = FALSE)
#> # A tibble: 2 x 2
#> x y
#> <dbl> <dbl>
#> 1 1 1
#> 2 1 2
2019-09-14に reprexパッケージ (v0.3.0)によって作成されました