web-dev-qa-db-ja.com

lapplyの無名関数

WickhamのAdvancedRの本を読んでいます。この質問は、第12章-汎関数の質問5の解決に関連しています。演習では、次のことを求められます。

各コンポーネントの名前と値の両方をFUNに提供するバージョンのlapply()を実装します。

さて、以下のコードを実行すると、1つの列に対して期待される答えが得られます。

_c(class(iris[1]),names(iris[1]))
_

出力は次のとおりです。

_"data.frame"   "Sepal.Length"
_

上記のコードに基づいて、これが私がしたことです:

_lapply(iris,function(x){c(class(x),names(x))})
_

ただし、出力はclass(x)からのみ取得し、names(x)からは取得しません。なぜそうなのですか?

また、paste()を試して、機能するかどうかを確認しました。

_lapply(iris,function(x){paste(class(x),names(x),sep = " ")})
_

出力にはclass(x)しか表示されません。 names(x)が返されていません。

なぜそうなのですか?また、どうすれば修正できますか?

誰か助けてくれませんか?

7
watchtower

データフレームを直接調べる代わりに、状況を切り替えて、列名のベクトルを繰り返し調べることができます。

_data(iris)

lapply(colnames(iris), function(x) c(class(iris[[x]]), x))
_

または、データフレームを参照して、列のインデックスを超えます。

_lapply(1:ncol(iris), function(x) c(class(iris[[x]]), names(iris[x])))
_

シングルとダブルの両方の角かっこを使用していることに注意してください。
_iris[[n]]_はリストniris番目のオブジェクトの値を参照し(データフレームは特定の種類のリストです)、すべての属性を取り除き、何かを作成しますmean(iris[[1]])のように可能です。
_iris[n]_はnthオブジェクト自体を参照し、すべての属性はそのままで、names(iris[1])のようなものを可能にします。

6
AkselA