3

Rのapply関数を使用するように、既存のループベースのコードを変換しようとしています。このプロジェクトの仕様に従って、追加のライブラリ(plyrなど)は許可されていません。

これが現在の動作です。

  Type Pressure Temp
1   Iron      100   10
2 Copper      200   20
for(i in 1:rnow(data))
{
    if(data$Type[i] == "Iron")
         Output[i] <- IronCalculation(data$Pressure[i]...)
    else if(data$Type[i] == "Copper")
         Output[i] <- CopperCalculation(data$Pressure[i]...)
}

これを変換して関数を使用したいと思いapply()ます。私はいくつかの方法を試しましたが、apply()すべての変数値を文字に変換するために行き詰まり、これらの数値をコンパイルすることはできません。元のデータセットには150以上の変数があり、その多くは文字列/文字です。

テストとして、私は以下を試しました。明らかに失敗します。as.numeric()を使用して文字変数を数値に変換できますが、8000以上の行とそれぞれに20個の変数があります。CPUサイクルの浪費のようです。

apply(data[1,], 2, function(x) {
if(x['Type'] == "Iron")
             Output <- IronCalculation(x['Type'],x['Pressure']...)
})

誰か助けてもらえますか?適用関数を使用するようにこのループを変更するにはどうすればよいですか?

4

1 に答える 1

0

試す

apply(data, 1,  
  function(x) {  
    if (x['Type'] == 'Iron')  
      IronCalculation(as.numeric(x['Pressure']), as.numeric(x['Pressure']))  
    else if (x['Type'] == 'Copper')  
      CopperCalculation(as.numeric(x['Pressure']), as.numeric(x['Pressure']))  
  }  
)  

するとベクトルが得られます。 匿名関数に渡されると、 との両方が文字に強制されるas.numeric()ため、 が必要です。PressureTempType

編集:しかしswitch()、ネストされた s の代わりに @Justin が提案するように使用ifすると、はるかに洗練されます。

于 2016-02-02T02:28:58.320 に答える