tbl_df
1つの列が名前付き変数のリスト(それ自体はほとんどがリストです)であるforがあります。できれtidyverse
ばコードを使用して、これらの変数のセットに関数を適用し、これらの関数呼び出しのそれぞれの出力をデータフレームの新しい列に変換したいと思います(mutate_at
これらのネストされた変数の場合と同じです)。
たとえば、私の現在のデータは次のようなものです。
d <- tibble(
l = list(list("a"=list("a1","a2","a3","a4"),
"b"=list("b1","b2","b3")),
list("a"=list("x1","x2"),
"b"=list("y3")))
)
# A tibble: 2 x 1
l
<list>
1 <list [2]>
2 <list [2]>
複数の関数を指定する場合と同じ方法で、d$l
(、a
およびb
)の変数に関数を適用し、mutate_at
それらを作成した変数にちなんで名付けられた新しい列を自動的に作成したいと思います。たとえば、適用したい1つの関数は、それらの長さを新しい列として返します。
# A tibble: 2 x 3
l n_a n_b
<list> <dbl> <dbl>
1 <list [2]> 4. 3.
2 <list [2]> 2. 1.
誰かがこれを行う簡単な方法を知っていますか?これまで私はこのようなことをしてきました:
d %>%
mutate(n_a = purrr::map(l, ~length(.$a)) %>%
purrr::simplify(),
n_b = purrr::map(l, ~length(.$b)) %>%
purrr::simplify())
しかし、のすべての変数についてそれを書き出す必要はありませんl
(実際のデータには最大24個の変数があります)。
編集:また、明確にするために、長さを取得する例は、私が適用したい関数の1つにすぎません。の変数の任意のサブセットに任意の関数を適用する、より一般的な方法が本当に必要です。l
lengths
要素をループせずに要素の長さを抽出するために使用できます。そして、bind_cols
代わりにmutate
を使用して、データフレームに複数の列を追加します。
d %>% bind_cols(map_dfr(.$l, ~ as.list(lengths(.))))
# A tibble: 2 x 3
# l a b
# <list> <int> <int>
#1 <list [2]> 4 3
#2 <list [2]> 2 1
またはcompose
チェーンに使用しas.list
てlengths
:
d %>% bind_cols(map_dfr(.$l, compose(as.list, lengths)))
# A tibble: 2 x 3
# l a b
# <list> <int> <int>
#1 <list [2]> 4 3
#2 <list [2]> 2 1
このメソッドがリストの名前を動的にチェックすることに注意してください。特定の名前の要素が欠落している場合、結果はNA
次のようになります。
d <- tibble(
l = list(list("a"=list("a1","a2","a3","a4")),
list("a"=list("x1","x2"),
"b"=list("y3")))
)
d %>% bind_cols(map_dfr(.$l, ~ as.list(lengths(.))))
# A tibble: 2 x 3
# l a b
# <list> <int> <int>
#1 <list [1]> 4 NA
#2 <list [2]> 2 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加