2016-04-28 14 views
1

私は以下のようなデータフレームを持っています。Rデータフレームの行の比較を行うにはどうすればいいですか

SampleDF <- structure(list(FirstVal = c(100, 230, 450, 600), SecondVal = c(566, 
547, 557, 250), ThirdVal = c(782, 479, 823, 178), LowerLimit = c(10, 
15, 22, 50), UpperLimit = c(600, 500, 600, 500)), .Names = c("FirstVal", 
"SecondVal", "ThirdVal", "LowerLimit", "UpperLimit"), row.names = c(NA, 
4L), class = "data.frame") 

私はFirstVal, SecondVal and ThirdValという名前の列と2列の計算UpperLimit and LowerLimitを持っています。

私は下限と上限の範囲内にあり、UpperLimitを超える要素をすべて破棄する要素を各行から選択しようとしています。それを排除した後、残りの要素の中で最も大きい要素を見つけ出し、新しい列に追加したいと考えています。

さらに、列名を追加したいと思います。元のデータフレームを転置してみましたが、元の列を参照する際に問題があります。

Rで行比較を実行するにはどうすればよいですか?


予想される出力:これは動作します

SampleDFNew 
    FirstVal SecondVal ThirdVal LowerLimit UpperLimit MaxValBelowUpperLim ColumnName 
1  100  566  782   10  600     566 SecondVal 
2  230  547  479   15  500     479 ThirdVal 
3  450  557  823   22  600     557 SecondVal 
4  600  250  178   50  500     250 SecondVal 

答えて

1

1.最初に、制限に該当しない値を見つけて削除します。

2.他の要素の中でmaxを見つけて、列名から名前を抽出します。

x<-sapply(SampleDF[,1:3],function(x) ifelse(x > SampleDF$LowerLimit & x < SampleDF$UpperLimit,x,NA)) 

SampleDf$Columnname <- colnames(x)[apply(x,1,which.max)] 
+0

私は、関数(光沢のある反応性や簡単な関数)の内側に上記のプロセスを使用しようとすると、なぜそれが以下のエラーを与えていますか? 'colnames(x_r)のエラー[apply(x_r、1、which.max)]:無効なサブタイプ 'list'' – sunitprasad1

2

あなたは試すことができます:

tmp<-(SampleDF[,1:3]>=SampleDF$LowerLimit & SampleDF[,1:3]<=SampleDF$UpperLimit)*as.matrix(SampleDF[,1:3]) 
colnames(SampleDF[,1:3])[max.col(tmp*NA^(rowSums(tmp)==0))] 
#[1] "SecondVal" "ThirdVal" "SecondVal" "SecondVal" 
+0

パーフェクト!!しかし、@koundyが最初に投稿したので、私はその答えを "受け入れ"ました。 – sunitprasad1

+2

それに問題はなく、うれしいです。また、私のソリューションはベクトル化されており、はるかに高速でなければならないと考えてください。 – nicola

+0

はい、本当に早いです。 – sunitprasad1

関連する問題