2

について質問がありaaplyます。どの列を確認したいのですis.numericが、戻り値がaaply予想外です。以下はコード例です。"data.frame"すべての列を取得するのはなぜですか(これは、数値ベクトルを含む列でも取得できる理由を説明しています) is.numericFALSE

ありがとう!

data=data.frame(str=rep("str",3),num=c(1:3))

is.numeric(data[,1])
# FALSE
is.numeric(data[,2])
# TRUE

aaply(data,2,is.numeric)
# FALSE FALSE

aaply(data,2,class)
# "data.frame" "data.frame"

編集: 他の状況では、これは警告メッセージを生成します:

aaply(data,2,mean)

# 1: mean(<data.frame>) is deprecated.
#    Use colMeans() or sapply(*, mean) instead. 
4

2 に答える 2

4

これが機能する方法であり、各関数呼び出しに渡されるもの、の各列を表す data.frame を確認するためにaaply使用することもできます。identitydata

aaply(data, 2, identity)
# $num
#   num
# 1   1
# 2   2
# 3   3
# 
# $str
#   str
# 1 str
# 2 str
# 3 str

したがってaaply、必要な方法を使用すると、次のような各 data.frame の最初の列を抽出する関数を使用する必要があります。

aaply(data, 2, function(df)is.numeric(df[[1]]))
#   num   str 
#  TRUE FALSE 

しかし、単に行う方がはるかに簡単なようです:

sapply(data, is.numeric)
#   str   num 
# FALSE  TRUE 
于 2012-05-20T13:45:19.643 に答える
1

基本的な理由は、動作するように設計されていないクラスの引数を適切に提供していることです。plyr 関数の最初の文字は、引数の型を表します。この場合、"a" はarray. 配列を提供すると、期待どおりに機能します。

> xx <- plyr::aaply(matrix(1:10, 2), 2, class)
> xx
        1         2         3         4         5 
"integer" "integer" "integer" "integer" "integer" 

少なくとも、ヘルプ ページを読むまでは、それが私の理解でした。データフレーム入力を受け入れる必要があり、配列を出力する必要があると書かれています。したがって、ドキュメントのエラーまたは関数のバグのいずれかを発見しました。いずれにせよ、これを取り上げる正しい場所は'manipulatr' Google-newsgroupです。@hadley はここでも貴重な貢献者であるため、問題を解決するために同行する可能性はかなりあります。

于 2012-05-20T14:43:00.123 に答える