1つのdata.frame(raw_DF)からデータの行を取得し、別のdata.frame(calibrant_DF)からキャリブレーションデータを使用して、Raw12のキャリブレーション値を計算するカスタム関数を使用しようとしています。このエラーが発生します:
cal_DF $ Cal_setのエラー:$演算子はアトミックベクトルには無効です呼び出し元:トップレベル
適用関数はdata.frameをこのように渡すことを好まないようです。そのため、別の適用関数(mapply、lapplyなど)またはplyrを使用できるかどうかを判断するために過去数時間を費やしました。私がやろうとしていることを達成するための機能ですが、運がありません。提案?
サンプルコード(実際の関数とDFはより複雑です):
raw_DF<-data.frame("Cal_set"=c(1,2,1,2),"Raw12"=c(3.3,3.1,5.1,4.2))
calibrant_DF<-data.frame("Cal_set"=c(1,2),"b12"=c(.01,.04),"m12"=c(.95,.99))
apply.cals <- function(raw_row,cal_DF){
current_cals<-cal_DF[which(cal_DF$Cal_set==raw_row$Cal_set),]
raw12<-raw_row$Raw12
cal12<-(raw12-current_cals$b12)/current_cals$m12
outdata<-data.frame(raw12,cal12)
return(outdata)
} # End of apply.cals
calibrated_data<-apply(X=raw_DF,MARGIN=1,FUN=apply.cals,cal_DF="calibrant_DF")
そして、私の希望する出力は、次のような結果のdata.frame(またはdata.frameに入れることができるもの)です。
raw12 cal12 3.3 3.463158 3.1 3.090909 5.1 5.357895 4.2 4.20202
アドバイスありがとうございます!
編集-解決しましたが....誰かが考えているなら、私はプライヤーソリューションに興味があります-それは私がもっとよく理解したい機能であり、私の印象はこれがエレガントに対処できる問題だということです。
apply
行列を期待します-そしてそれがデータフレームを取得すると、それを行列に変換します。したがって、$
で信頼することはできませんapply
。
コードを機能するものにすばやく変換する1つの方法は、次のとおりです。
sapply(split(raw_DF, rownames(raw_DF)), apply.cals, cal_DF=calibrant_DF)
split(raw_df, rownames(raw_DF))
raw_DFをリストに変換します。ここで、各コンポーネントは1行のみのデータフレームです。そしてsapply
、そのような各データフレームに関数を適用します。
この例で得られるものは次のとおりです。
# 1 2 3 4
# raw12 3.3 3.1 5.1 4.2
# cal12 3.463158 3.090909 5.357895 4.20202
(出力があなたにとって意味があることを願っています...)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加