2016-08-15 8 views
0

私はRでクロス集計を行い、平均を計算しようとしています。with()を使用してクロス集計を実行するときの警告?

まず私は、変数を選択して、新しいデータフレームを作成しました:

 seed <- ruk_trial$Ruk_seed_input #integer 
     soilec <- ruk_trial$Ruk_soilEC  #num 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 0] <- 'US' 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 1] <- 'LS' 
     ruk_trial$code_smoo[ruk_trial$code_smoo == 2] <- 'HS' 
     zones <- ruk_trial$code_smoo  #chr 
     netincome <- ruk_trial$NetIncome #num 
     yield <- ruk_trial$Dry_yield  #num 
     ruk_df <- as.data.frame(cbind(seed,soilec,zones,netincome,yield)) 

その後、私は()を使用します。

 with(ruk_df, tapply(netincome, list(zones=zones, seed=seed), mean)) 

しかし、それは結局のところ:

 seed 
    zones 105 120 75 90 
    HS NA NA NA NA 
    LS NA NA NA NA 
    US NA NA NA NA 
    There were 12 warnings (use warnings() to see them) 

    > warnings() 
Warning messages: 
1: In mean.default(X[[i]], ...) : 
    argument is not numeric or logical: returning NA 

をした場合、私は元のデータセットを使用してください。

> cross.tab<- with(ruk_trial, tapply(netincome, list(zones=zones,seed=seed), mean)) 

誰でも警告の原因を教えていただけますか?

+2

あなた 'cbind'が行列を返し、行列が唯一のデータモードを持つことができますcbind'文字 –

+1

'にすべてを行っているので、あなたの数値データを文字に強制取得され、 as.data.frameはそれらの文字列をfactorに変換します。代わりに、 'as.data.frame(cbind(...)) 'の代わりに' as.data.frame(...) 'を実行してください。 – eipi10

+1

また、カウント、手段、その他の統計をグループ別に計算するには、 'dplyr'や' data.table'パッケージが便利でしょう。たとえば、 'dplyr'では、グループ(ビルドイン' mtcars'データフレームを使用して)で要約すると、 'library(dplyr); mtcars%>%group_by(am、vs)%>%summarise_all(funs(n()、mean(。))) ' – eipi10

答えて

1

はこれを試してみてください:

ruk_df <- data.frame(seed,soilec,zones,netincome,yield, stringsAsFactors=FALSE) 
+0

ありがとうございます!できます。私はちょうど 'as.data.frame'を使ってデータフレームを作ることが間違っていることに気付きました。 'cbind'はすべての変数を要素に変換しました。 @renato vitolo –

+0

リチャードとeipi10によって、 'cbind'によって'文字 'に変換され、' as.data.frame'によって 'factor'に変換されました。 –

関連する問題