質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

2回答

608閲覧

ネストされたリストを、リストのベクトルにしたい

T.FUSE

総合スコア6

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2023/01/04 14:27

前提

次のようなリストがあります。

R

1 2> list_a 3 4List of 3 5 $ :List of 2 6 ..$ : chr "Covid-19" 7 ..$ : chr "safety net" 8 $ :List of 4 9 ..$ : chr "Covid-19" 10 ..$ : chr "Tax" 11 ..$ : chr "safety net" 12 ..$ : chr "basic income" 13 $ :List of 2 14 ..$ : chr "Tax" 15 ..$ : chr "safety net"

いくつかのChr型文字列をリストとして要素に持つ、リストです。ここではリスト要素が、それぞれ2つ、4つ、2つの文字列要素の3つのリストとなっています。

実現したいこと

これを次の形のベクトルにして、別のデータフレームに持たせたいです。

c([<1番目のリスト:2要素>], [<2番めのリスト: 4要素>], [<3番めのリスト:2要素>])

発生している問題・エラーメッセージ

chr [1:8] "Covid-19" "safety net" "Covid-19" "Tax" "safety net" "basic income" "Tax" "safety net" 警告: Error in data.frame: 引数に異なる列数のデータフレームが含まれています: 3, 0

該当のソースコード

R

1df <- data.frame( 2 chr_b = unlist(list_a) 3)

試したこと

unlist を使うと、ネストされたリストがすべて解除されて、1列のベクトルになってしまうことがわかりました。

ネストを1段階だけ解除して、データに持たせたいです。
(ベクトルにリストを要素としてもたせることはできないのであれば、こういう場合はどのようにデータをデータフレームにもたせたらよいのでしょうか。配列(array)に変換するのでしょうか?)

補足情報(FW/ツールのバージョンなど)

R 4.2.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

非構造データなので、要素としてベクトルを持つ tibble と相性がいいのではないでしょう

library(dplyr) library(tidyr) library(purrr) list_a <- list( list("Covid-19", "safety net"), list("Covid-19", "Tax", "safety net", "basic income"), list("Tax", "safety net")) # 各nestされたlistをベクトルにする list_a2 <- map(list_a, unlist) # long形式 long_nested_tibble <- tibble::tibble(list_ind = paste0("list_", 1:length(list_a2)), chr_col = list_a2) # wide形式 wide_nested_tibble <- long_nested_tibble %>% pivot_wider(names_from = list_ind, values_from = chr_col) long_nested_tibble wide_nested_tibble # > long_nested_tibble # # A tibble: 3 × 2 # list_ind chr_col # <chr> <list> # 1 list_1 <chr [2]> # 2 list_2 <chr [4]> # 3 list_3 <chr [2]> # > wide_nested_tibble # # A tibble: 1 × 3 # list_1 list_2 list_3 # <list> <list> <list> # 1 <chr [2]> <chr [4]> <chr [2]>

投稿2023/01/05 02:17

編集2023/01/05 02:23
cuttlefish44

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.FUSE

2023/01/06 00:41

map を使って、リストの要素毎にunlist する、縦横の方向を自在にコントロールするコードの書き方、すごく参考になります。かっこいいですね
guest

0

ベストアンサー

配列(array)に変換するのでしょうか?)

matrix に変換します。

r

1list_a <- list( 2 list("Covid-19", "safety net"), 3 list("Covid-19", "Tax", "safety net", "basic income"), 4 list("Tax", "safety net")) 5 6df <- data.frame(chr_b = matrix(list_a, nrow=length(list_a))) 7 8df 9str(df) 10 11# chr_b 12# 1 Covid-19, safety net 13# 2 Covid-19, Tax, safety net, basic income 14# 3 Tax, safety net 15# 16# 'data.frame': 3 obs. of 1 variable: 17# $ chr_b:List of 3 18# ..$ :List of 2 19# .. ..$ : chr "Covid-19" 20# .. ..$ : chr "safety net" 21# ..$ :List of 4 22# .. ..$ : chr "Covid-19" 23# .. ..$ : chr "Tax" 24# .. ..$ : chr "safety net" 25# .. ..$ : chr "basic income" 26# ..$ :List of 2 27# .. ..$ : chr "Tax" 28# .. ..$ : chr "safety net"

投稿2023/01/04 18:48

melian

総合スコア19712

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.FUSE

2023/01/06 00:58

なるほど、matrix にしてから格納するのですね。 df$chr_b[1][[1]] とかけば、 "Covid-19" が、df$chr_b[2][[3]] とかけば "safety net" が 取り出せますかね?
cuttlefish44

2023/01/06 01:23 編集

(横からすみません) この形式で満足なのであれば、`tibble::tibble(chr_b = list_a)` で一発です (実用上ほぼ一緒ですが) dfがよければ、さらに `as.data.frame` をかましてください。 (コンソール出力で見た目が違うのはtibbleとdfでデフォルトでの表示方法が違う、というだけです) ちなみに、取り出し方の記述は `df$chr_b[[1]][[2]]` のように一つめが [[xxx]] ですよ〜。 もしくはpurrr::pluckを利用して、`df %>% pluck("chr_b", 1, 2)` とも記述できます。
T.FUSE

2023/01/06 05:07 編集

今回は、どうしてもほかのベクトルをあわせもつ data.frame にする必要があったのです。tibble から as.data.frameを行う技もあるのですね。 cuttlefish44 さん、データの前処理自由自在ですね。また別の質問をさせていただくときにもいろいろ教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問