2016-04-28 12 views
-1

大きなデータフレームのすべての数値変数に変換を適用する必要があります。データフレームには他のタイプの変数もあります。関数を使用してデータフレーム内のすべての数値変数を変換する

transformDivideThousand <- function(data_frame){ 
    for(i in ncol(data_frame)){ 
     if (is.numeric(data_frame[i])) { 
      data_frame[i]/1000 
     } 
    } 
    return(data_frame) 
} 
:私の最初のアイデアは、ここではいくつかのポインタいただければ幸いです、彼らは数値かどうかを確認してから、私は機能のために私のコードで立ち往生持っ1000

によってそれらを分割する、すべての列を反復処理することでした

機能の実行:

test <- transformDivideThousand(mypatients) 
  • 試験がデータフレームであるが、変換は起きていません。どこが間違っていたのですか?
  • また、transformDivideThousandにオプションの引数を付けることもできます。空の場合は、すべての変数に対して繰り返し使用する変数の名前をリストに渡すことができます。
+5

結果をループに戻す必要があります。 'data_frame [[i]] < - data_frame [[i]]/1000'である。列を抽出するには、二重角括弧を使用します。 '['と '[' 'の違いを知るべきです。例えば、 'is.numeric(data_frame [i])'は 'TRUE'をほとんど返さないでしょう。また、ループが正しく定義されていません。 'for(i in 1:ncol(data_frame))'でなければなりません。そうでなければ最後のカラムだけが考慮されます。 – nicola

答えて

4

@ nicolaさんのコメントは、あなたのループに何が起こっているのかを説明しています。もう1つの方法は、sapplyを使用して数値列を識別することで、より簡潔なコードになります。例えば、内蔵のirisデータフレーム使用:

iris[, sapply(iris, is.numeric)] = 
     iris[, sapply(iris, is.numeric)]/1000 

をあなたは上記のように、データフレーム上で直接これを実行することができ、または関数の中にそれを置く:

tDT <- function(data_frame) { 

    data_frame[, sapply(data_frame, is.numeric)] = 
    data_frame[, sapply(data_frame, is.numeric)]/1000 

    return(data_frame) 

} 

その後にそれを実行します。

iris.new = tDT(iris) 

今後の参考のために、@のニコラさんのコメントにつき、ここでループバージョンの仕事のために作る方法は次のとおりです。

tDT2 <- function(data_frame) { 

    for (i in 1:ncol(data_frame)) { 
    if (is.numeric(data_frame[,i])) { 
     data_frame[,i] = data_frame[,i]/1000 
    } 
    } 
    return(data_frame) 
} 
関連する問題