3

purrr パッケージのさまざまなmap()関数を使用して、整数または文字列を関数に渡し、サブリストから要素を抽出できます。これらは、私が期待するとおりに機能します。

listy <- list(A = list("silence", "cats", X = list(Aa = "dogs", "birds")),
              B = list("silence", "fish-head", Y = list(Bb = "fish-face", "squirrel")))

> str(listy)
List of 2
 $ A:List of 3
  ..$  : chr "silence"
  ..$  : chr "cats"
  ..$ X:List of 2
  .. ..$ Aa: chr "dogs"
  .. ..$   : chr "birds"
 $ B:List of 3
  ..$  : chr "silence"
  ..$  : chr "fish-head"
  ..$ Y:List of 2
  .. ..$ Bb: chr "fish-face"
  .. ..$   : chr "squirrel"

list1 <- listy %>% map(1) %>% str  # returns "silence" from A and B
list2 <- listy %>% map(2) %>% str  # returns "cats" and "fish-head"
list3 <- listy %>% map(c(3, 1)) %>% str # returns "dogs" and "fish-face" from the lists X and Y within the list.

私の質問は、このリストから複数の要素を抽出するにはどうすればよいですか? AとBから「沈黙」、AとBから「猫」と「魚の頭」(つまり、AとBの両方の要素1と2)が必要な場合、それは可能map()ですか?そうでない場合、これを行う最善の方法は何ですか?

これが私がうまくいくと思っていたものです:

list4 <- listy %>% map(1, 2) %>% str

1 は各サブリストの最初の要素を参照し、2 は 2 番目の要素を参照します。しかし、これは上記の と同じものを返しますlist1。ネストされた構造 (つまり ) を参照するため、使用c(1, 2)は機能しません[[1]][[2]]。ドキュメントと Google で見つけたいくつかの例に目を通しましたが、うまくいきませんでした。何か案は?

更新: 理想的には、「沈黙」のように名前で要素を選択できるようにしたいと説明する必要があります。ただし、これはあまりうまく機能していないようです。(必要な要素の位置が変わる大きなリストがいくつかあります)

4

2 に答える 2

6

このようなもの?

library(purrr)
listy %>% map(., function(x) c(x[[1]], x[[2]]))

$A
[1] "silence" "cats"   

$B
[1] "silence"   "fish-head"

の形式で出力を取得するにはdata.frame

listy %>% map_df(., function(x) c(x[[1]], x[[2]]))

# A tibble: 2 x 2
        A         B
    <chr>     <chr>
1 silence   silence
2    cats fish-head

または、@Richard Scriven が提案するように、

map(listy, ~ unlist(.[1:2]))
于 2016-08-01T19:25:32.867 に答える
2

ベース R には 2 つのオプションがありますlapply

ネストされたリスト構造を保持するには、次を使用します

lapply(listy, "[", 1:2)
$A
$A[[1]]
[1] "silence"

$A[[2]]
[1] "cats"


$B
$B[[1]]
[1] "silence"

$B[[2]]
[1] "fish-head"

ベクトルの単一のリストを返すには、次を使用します

lapply(listy, function(i) unlist(i[1:2]))
$A

"silence"    "cats" 

$B

  "silence" "fish-head" 

2 番目のメソッドをラップしてdata.frame、data.frame を返すことができます。

data.frame(lapply(listy, function(i) unlist(i[1:2])))
        A         B
1 silence   silence
2    cats fish-head
于 2016-08-01T19:30:11.293 に答える