59

データを理解する一環として、大きなデータ フレームの各列の最小値/最大値を取得しようとしています。私の最初の試みは:

apply(t,2,max,na.rm=1)

最初の数列は文字型であるため、すべてを文字ベクトルとして扱います。そのため、一部の数値列の最大値は として出てきます" -99.5"

次に、これを試しました:

sapply(t,max,na.rm=1)

しかし、 factor にとって意味のない maxについて文句を言います。(lapply同じです。)私を混乱させているのは、apply考えmaxが要因に対して完全に意味があることです。たとえば、列1に「ZEBRA」が返されました。

ところで、Using sapply on vector of POSIXct を調べたところ、答えの 1 つに「sapply を使用すると、オブジェクトが強制的に数値に変換されます...」とあります。これは私に起こっていることですか?もしそうなら、強制しない代替の適用機能はありますか? データ フレーム タイプの重要な機能の 1 つは、各列を異なるタイプにできることであるため、これは確かに一般的なニーズです。

4

7 に答える 7

44

それが「順序付けられた要因」である場合、状況は異なります。「順序付き因子」が好きだと言っているわけではありませんが、「因子」に対して定義されていない「順序付き因子」に対して定義されている関係があると言っているだけです。因子は、通常のカテゴリ変数と見なされます。ロケールのアルファベット順の字句順である要素の自然な並べ替え順序が表示されています。すべての列、...日付、要因、およびすべてに対して「数値」への自動強制を取得する場合は、次を試してください。

sapply(df, function(x) max(as.numeric(x)) )   # not generally a useful result

または、最初に要因をテストして、期待どおりに返したい場合は、次のようにします。

sapply( df, function(x) if("factor" %in% class(x) ) { 
            max(as.numeric(as.character(x)))
            } else { max(x) } )

@Darrensのコメントはうまく機能します:

 sapply(df, function(x) max(as.character(x)) )  

maxは文字ベクトルで成功します。

于 2011-09-05T02:24:03.907 に答える
21

maxが機能する理由applyは、apply最初にデータ フレームをマトリックスに強制することであり、マトリックスは 1 つのデータ型しか保持できないためです。したがって、文字のマトリックスになります。sapplyは単なるラッパーであるためlapply、両方が同じエラーを生成しても驚くことではありません。

データ フレームを作成するときの既定の動作では、カテゴリ列がfactorとして格納されます。順序付けされた因子であることを指定しない限り、 R は順序付けられていない因子を作成したと想定しているため、maxおよびのような操作は未定義になります。min

を指定することでこの動作を変更できます。これによりoptions(stringsAsFactors = FALSE)、セッション全体のデフォルトが変更されます。またはstringsAsFactors = FALSEdata.frame()構築呼び出し自体を渡すこともできます。これは、デフォルトで「アルファベット順」の順序を想定していることminを意味するだけであることに注意してください。max

または、各要素の順序を手動で指定することもできますが、それがあなたのやりたいことだとは思えません。

いずれにせよ、sapply一般的にアトミック ベクトルが生成されます。これには、多くの場合、すべてを文字に変換する必要があります。これを回避する 1 つの方法は次のとおりです。

#Some test data
d <- data.frame(v1 = runif(10), v2 = letters[1:10], 
                v3 = rnorm(10), v4 = LETTERS[1:10],stringsAsFactors = TRUE)

d[4,] <- NA

#Similar function to DWin's answer          
fun <- function(x){
    if(is.numeric(x)){max(x,na.rm = 1)}
    else{max(as.character(x),na.rm=1)}
}   

#Use colwise from plyr package
colwise(fun)(d)
         v1 v2       v3 v4
1 0.8478983  j 1.999435  J
于 2011-09-05T02:30:26.633 に答える
7

データを学習したい場合summary (df)は、数値列の最小、第1分位、中央値と平均、第3分位と最大、および因子列の最上位レベルの頻度を提供します。

于 2011-09-05T07:25:59.243 に答える