2016-08-11 5 views
4

私は長い間Rを使ってきたので、「こんにちは、私は初心者です、これを私に説明してください」と言うことはできません。しかし、それは私が今この問題にぶつかってきたので、私がそれを解決して何か他のものに取り組むたびに尋ねたいことです。しかし、今日私は十分に尋ねるには不思議です。要素が単一の列でないデータフレーム

私は、データフレームを同じ長さの列のコレクションと考えています。私はそれが間違っていることを認識しています。データフレームに行列、複数列の要素を挿入できるので間違っています。私が間違ってそれをすると、私は画面に真実を印刷しないものに終わります。私は、データフレームを依頼する明確な方法を見つけることができません「頭」は、それが持っているとそれが本当に持って言っているRの間

  1. 一見矛盾した列名、および

  2. 「がありますあなたはあります可変データフレームごとに1つの列がありますか」、または「人生を困難にするような内部構造の不満を持っていますか?

あなたがこれを行うと、私は何を意味するのか分かります。 Run

example(predict.lm) 

これは、予測方法を実行し、ptという出力の行列を生成します。

そして、その後NPK

npk$predict <- predict(npk.aov, type = "terms") 

という名前のデータフレームに追加し、その代わりとして自立マトリックス出力を取る、彼らの例の最後のステップを変更、NPKは何ですか?それはまだデータフレームですか?はい

> is.data.frame(npk) 
    [1] TRUE 

うーん、頭が列名をどのように報告するか注意してください。

> head(npk) 
    block N P K yield predict.block predict.N predict.P 
1  1 0 1 1 49.5 -0.8500000 -4.9250000 0.2083333 
2  1 1 1 0 62.8 -0.8500000 4.9250000 0.2083333 
3  1 0 0 0 46.8 -0.8500000 -4.9250000 -0.2083333 
4  1 1 0 1 57.0 -0.8500000 4.9250000 -0.2083333 
5  2 1 0 0 59.8  2.5750000 4.9250000 -0.2083333 
6  2 1 1 1 58.5  2.5750000 4.9250000 0.2083333 
predict.K predict.N:P predict.N:K predict.P:K 
1 -0.9583333 0.9416667 1.1750000 0.4250000 
2 0.9583333 -2.8250000 1.1750000 -0.1416667 
3 0.9583333 0.9416667 1.1750000 -0.1416667 
4 -0.9583333 0.9416667 -3.5250000 -0.1416667 
5 0.9583333 0.9416667 1.1750000 -0.1416667 
6 -0.9583333 -2.8250000 -3.5250000 0.4250000 
    predict.N:P:K 
1  0.0000000 
2  0.0000000 
3  0.0000000 
4  0.0000000 
5  0.0000000 
6  0.0000000 

これは「predict.block」または「predict.P」という名前の列があるかのようにそれが見えますが、そこにありますない:

> colnames(npk) 
[1] "block" "N"  "P"  "K"  "yield" 
[6] "predict" 

機能は "COLNAMES" より適切に "column_or_whatever_else_we_find_here" と命名されることになります。

そして、あなたはそれらの「列は」内部予測にアクセスするには

> npk$predict.P 
NULL 

をしようと何を取得、あなたが構造を知っているとマトリックスのように聞いている:

> npk$predict[ , "P"] 
     1   2   3   4   5 
0.2083333 0.2083333 -0.2083333 -0.2083333 -0.2083333 
     6   7   8   9   10 
0.2083333 -0.2083333 0.2083333 0.2083333 0.2083333 
     11   12   13   14   15 
-0.2083333 -0.2083333 -0.2083333 0.2083333 -0.2083333 
     16   17   18   19   20 
0.2083333 0.2083333 -0.2083333 -0.2083333 0.2083333 
     21   22   23   24 
-0.2083333 0.2083333 0.2083333 -0.2083333 

私はこの例を選びました私と学生がデータフレームに非カラムのものを追加するときに、しばしば誤って起こることを示します。

NPKに参加して、私は人生が行くように、あまりにも

> npk.new <- merge(npk, pt, by = "row.names", 
        suffixes = c("", ".predict")) 
> colnames(npk.new) 
[1] "Row.names"  "block"   "N"    
[4] "P"    "K"    "yield"   
[7] "block.predict" "N.predict"  "P.predict"  
[10] "K.predict"  "N:P"   "N:K"   
[13] "P:K"   "N:P:K"   

は、しかし、時には我々は戻って私たちはそこで考えている関数から行列を得ることを理解し、出力がマージされる予測するための正しい方法誤って「データフレーム内の行列」のような構造になってしまいます。

大体私は "これも気付きますか?あなたが私を挫折させるようにあなたを苛立たせますか?私はそれが建設的ではないことを知っています。ここでもっと建設的なことを聞​​いてみましょう。

データフレームが与えられている場合、その中のすべての「列」が特異な列であるかどうかを知る最も直接的なルートは何ですか?私は明白なように試してみた:

> sapply(npk, is.atomic) 
    block  N  P  K yield predict 
    TRUE TRUE TRUE TRUE TRUE TRUE 
> sapply(npk, is.vector) 
    block  N  P  K yield predict 
    FALSE FALSE FALSE FALSE TRUE FALSE 

はこれまでのところ、私はそれが

> sapply(npk, is.matrix) 
    block  N  P  K yield predict 
    FALSE FALSE FALSE FALSE FALSE TRUE 

行列であればそれゆえ、私はそれぞれを尋ねる機能を書くことができ、データフレーム内の要素を求めることができます知っています列 "あなたは行列ですか"あなたは "データフレーム"ですか、あなたは "配列"ですか?しかし、それはあまりにも退屈なようです。

+0

どのようにそれはあなたの通常のカラム名以外のものを備えてかどうかを確認するためにNPK $のオートコンプリートを見てどうですか? RStudioでは、アイコンをスキミングするだけです。 – AlexR

+1

'str'はあなたの友人です、例えば' str(npk) 'です。 – Gregor

+0

また、「頭が列名を報告している」と思うのは、「頭」を記述するのが難しいということです。 'head'とは、最初の6行を返す(そして印刷する)ことです。 'names()'または 'colnames()'は列名を返します。また、 '' predict "'という名前の列があります。 – Gregor

答えて

4

あなたは多分正確にあなたが探していたものに応じて

is.simple <- function(x) {is.vector(x) | is.factor(x)} 

sapply(npk, is.simple) 

または多分

no.dims <- function(x) {is.null(dim(x))} 
sapply(npk, no.dims) 

を定義することができます。

あなたが関連するデータの種類が不明な場合

npk <- cbind(npk, predict = predict(npk.aov, type = "terms")) 

npkに列を追加する方が安全だろう。直接の割り当てはより危険です。 class

npk$predict <- predict(npk.aov, type = "terms") 
    sapply(npk,class) 
    #  block   N   P   K  yield predict 
    # "factor" "factor" "factor" "factor" "numeric" "matrix" 

sapply()内部

IIを使用

+0

私はいくつかの例でis.simple()をテストしましたが、まだ失敗しませんでした。 – pauljohn32

+0

まあ、自分のバブルを破棄するには、 'sapply(data.frame(x = as.Date(" 2001-01-01 "))、is.simple)'で失敗します。しかし、「no.dims」はうまくいくでしょう。日付は要因のような余分な属性を持っています。 – MrFlick

+0

Ach。私はちょうど今のDate問題に気付き、それに言及するためにログインしました。あなたは私にそれを打つ。私がこれを調べるほど、Rは非単一列のデータフレームへの挿入を可能にするということに困惑しています。 IMHO、それはもはやデータフレームとして定義されるべきではありません。 – pauljohn32

0

I.。 dim III

sapply(npk,dim) 
    # $block 
    # NULL 

    # $N 
    # NULL 

    # $P 
    # NULL 

    # $K 
    # NULL 

    # $yield 
    # NULL 

    # $predict 
    # [1] 24 8 

sapply()内部を使用して。 colnames IV

sapply(npk,colnames) 
    # $block 
    # NULL 

    # $N 
    # NULL 

    # $P 
    # NULL 

    # $K 
    # NULL 

    # $yield 
    # NULL 

    # $predict 
    # [1] "block" "N"  "P"  "K"  "N:P" "N:K" "P:K" "N:P:K" 

sapply()の内側を使用します。 attributes

sapply(npk,attributes) 
    # $block 
    # $block$levels 
    # [1] "1" "2" "3" "4" "5" "6" 

    # $block$class 
    # [1] "factor" 


    # $N 
    # $N$levels 
    # [1] "0" "1" 

    # $N$class 
    # [1] "factor" 


    # $P 
    # $P$levels 
    # [1] "0" "1" 

    # $P$class 
    # [1] "factor" 


    # $K 
    # $K$levels 
    # [1] "0" "1" 

    # $K$class 
    # [1] "factor" 


    # $yield 
    # NULL 

    # $predict 
    # $predict$dim 
    # [1] 24 8 

    # $predict$dimnames 
    # $predict$dimnames[[1]] 
    # [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" 
    # [16] "16" "17" "18" "19" "20" "21" "22" "23" "24" 

    # $predict$dimnames[[2]] 
    # [1] "block" "N"  "P"  "K"  "N:P" "N:K" "P:K" "N:P:K" 


    # $predict$constant 
    # [1] 54.875 

sapply()内部V.についてnpk

class(npk) 
    # [1] "data.frame" 

    mode(npk) 
    # [1] "list" 

    typeof(npk) 
    # [1] "list" 

    attributes(npk) 
    # $names 
    # [1] "block" "N"  "P"  "K"  "yield" "predict" 

    # $row.names 
    # [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 

    # $class 
    # [1] "data.frame" 


    str(npk) 
    # 'data.frame': 24 obs. of 6 variables: 
    # $ block : Factor w/ 6 levels "1","2","3","4",..: 1 1 1 1 2 2 2 2 3 3 ... 
    # $ N  : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 1 1 2 ... 
    # $ P  : Factor w/ 2 levels "0","1": 2 2 1 1 1 2 1 2 2 2 ... 
    # $ K  : Factor w/ 2 levels "0","1": 2 1 1 2 1 2 2 1 1 2 ... 
    # $ yield : num 49.5 62.8 46.8 57 59.8 58.5 55.5 56 62.8 55.8 ... 
    # $ predict: num [1:24, 1:8] -0.85 -0.85 -0.85 -0.85 2.57 ... 
    # ..- attr(*, "dimnames")=List of 2 
    # .. ..$ : chr "1" "2" "3" "4" ... 
    # .. ..$ : chr "block" "N" "P" "K" ... 
    # ..- attr(*, "constant")= num 54.9 


    dim(npk) 
    # [1] 24 6 

    dimnames(npk) 
    # [[1]] 
    # [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" 
    # [16] "16" "17" "18" "19" "20" "21" "22" "23" "24" 

    # [[2]] 
    # [1] "block" "N"  "P"  "K"  "yield" "predict" 


    summary.default(npk) 
    #   Length Class Mode 
    # block  24 factor numeric 
    # N   24 factor numeric 
    # P   24 factor numeric 
    # K   24 factor numeric 
    # yield  24 -none- numeric 
    # predict 192 -none- numeric 

VIを使用しました。追加情報:インストールとpsychパッケージをロード

library(psych) 
    list(npk_1_5 = describe(npk[,-6]),npk_6 = describe(npk[,6])) 
    $npk_1_5 
    #  vars n mean sd median trimmed mad min max range skew kurtosis se 
    # block* 1 24 3.50 1.74 3.50 3.50 2.22 1.0 6.0 5.0 0.00 -1.41 0.36 
    # N*  2 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10 
    # P*  3 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10 
    # K*  4 24 1.50 0.51 1.50 1.50 0.74 1.0 2.0 1.0 0.00 -2.08 0.10 
    # yield  5 24 54.88 6.17 55.65 54.75 6.15 44.2 69.5 25.3 0.24 -0.51 1.26 

    # $npk_6 
    #  vars n mean sd median trimmed mad min max range skew kurtosis se 
    # block 1 24 0 3.86 0.31 -0.11 5.13 -4.75 5.90 10.65 0.10 -1.41 0.79 
    # N  2 24 0 5.03 0.00 0.00 7.30 -4.92 4.92 9.85 0.00 -2.08 1.03 
    # P  3 24 0 0.21 0.00 0.00 0.31 -0.21 0.21 0.42 0.00 -2.08 0.04 
    # K  4 24 0 0.98 0.00 0.00 1.42 -0.96 0.96 1.92 0.00 -2.08 0.20 
    # N:P  5 24 0 1.67 0.94 0.19 0.00 -2.82 0.94 3.77 -1.08 -0.86 0.34 
    # N:K  6 24 0 2.08 1.17 0.23 0.00 -3.52 1.17 4.70 -1.08 -0.86 0.42 
    # P:K  7 24 0 0.25 -0.14 -0.03 0.00 -0.14 0.43 0.57 1.08 -0.86 0.05 
    # N:P:K 8 24 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 NaN  NaN 0.00 
関連する問題