2016-11-08 12 views
1

私はdata.framesとその働きをよく理解しているように感じますが、リストの特定の側面は私を混乱させます。ここでリストの動作を理解する

を開始するために、いくつかの再現性のあるデータである:

list_a <- structure(list(`one` = structure(list(
    words = c("a", "b","c", "d", "e", "f")), .Names = "words", class = "data.frame", row.names = c(NA,-6L)), 
    `two` = structure(list(words = c("a","s","t","z")), .Names = "words", class = "data.frame", row.names = c(NA, -4L))), 
    .Names = c("one", "two")) 

これは私達を与える:

list_a 
$one 
    words 
1  a 
2  b 
3  c 
4  d 
5  e 
6  f 

$two 
    words 
1  a 
2  s 
3  t 
4  z 

は今、私はdata.framesに結果の一部を返すために、リストをループにしたいです。

list <- list() 

for(i in list_a){list <- append(list, list_a$i$words)} 

これはリストに結果を生成しません。んでもない:

for(i in list_a){list <- append(list, list_a[[i]]$words)} 
Error in list_a[[i]] : invalid subscript type 'list' 

私はおそらく私の最初のループが機能しなかった理由は、私が正しい名前として私を定義せずにlist_a$i$wordsを使用していたということだと思いました。だから私は試してみました:

for(i in names(list_a)){list <- append(list, list_a$i$words)} 

これはまだ私に長さ0

のリストを与えるだから私は、私が試したの試みがdidntは私が期待した結果を与える理由の添え字を使用して、なぜ、私は知らない理解していません私にエラーを与え、最終的に私は正しい構文考え出し:名前のメソッドをやっていない使用している場合、この作業の理由

for(i in list_a){list2 <- append(list2, i$words)}

は、しかし、私は知りませんの?

+1

'for'ループでオブジェクトに追加しないでください。あらかじめ割り当てておく(またはこれを行う 'lapply'のようなループ関数を使用する)ようにしてください。とにかく、 'list_a $ i $ words'の代わりに' i $ words'を使います。ループはリスト要素を反復する。すなわち、「i」はリスト要素を含み、それらのインデックスは含まない。 – Roland

+0

ありがとう、誰かがそれをdownvotedとして質問の品質についての任意の洞察力と私はすべてのボックスをチェックした明快に例のデータから考えた? – Olivia

答えて

0

Rでfor式への引数は、からなる:

  • LHS、RHS
  • inの各値をとるイテレータ、言語キーワード
  • RHS、ベクター、長さその中で起こる反復の数を定義する。

最初のループを設定するとき、RHSはタイプ "list"の長さ2のベクトルでした。 LHSでは、1列のデータフレームであるiがあります。 $にlist_aから "i"を抽出するように依頼しました。これはNULLと評価されました。あなたの2番目のループでは、RHSは長さ2の "文字"型ベクトルでした。同じことが起こった。

$はインデックスを評価していません。代わりに[[を使用すると、2番目のループで期待する答えが得られます。

# initialize 
list <- list() 
# loop 
for (i in names(list_a)) { 
    list <- append(list, list_a[[i]]$words) 
} 
list 
# [[1]] 
# [1] "a" 
# 
# [[2]] 
# [1] "b" 
# ... 

Rolandが述べたように、各反復でオブジェクトの新しいコピーが作成されるため、Rには非常に高価です。 「data.frame」オブジェクトが適用「data.frame」クラス属性を持つだけで、「リスト」オブジェクトであることを

# create a data frame using all of list_a, 
# coerce to character vector 
# then coerce to list 
as.list(unname(unlist(do.call(what = "rbind", args = list_a)))) 

注:ここにしようとする一つの選択肢です。したがって、data.framesと$を使って作業しているときには、リストと同様に評価されていない名前で同じ動作が表示されます。

# print mtcars data.frame 
mtcars 
# set class attribute to NULL 
class(mtcars) <- NULL 
# mtcars is just a list now :-) 
mtcars 

EDIT:$[[は演算子である、ちょうど彼らが特別な方法で使用することができる機能であることを意味し、これを試してみてください。引数を丸い角かっこで渡して、通常の関数のように使用することもできます。

# $ is a function 
`$`(list_a, "one") 
# words 
# 1  a 
# 2  b 
# ... 

これらの機能の動作は異なります。 [[は、それが解釈するオブジェクトを期待しています。 $は、検索しようとする要素名が必要です。

i <- "one" 
# $ is a function, but there is no element "i" 
`$`(list_a, i) 
# NULL 
# [[ is a function, and an element "one" is present 
`[[`(list_a, i) 
# words 
# 1  a 
# 2  b 
# ... 
+0

'$'と '[]]'をもう少し説明できますか?なぜ 'list_a $ i $ words'は' NULL'と評価されますが、 'i $ words'はどちらの場合も' list_a'を見ていると正しいのですか? – Olivia

+0

@Olivia、追加の説明とともに編集された返信。それは物事をより明確にしますか? – CSJCampbell

+0

完璧なおかげで! – Olivia