1

Rのデータフレームの各行で計算を実行し、その計算をフレームの新しい列として追加しようとしています。「by」関数を使い始めましたが、計算が非常に遅いので、代わりに「apply」関数に切り替えました。私が想像する方法は、関数でapplyを実行し、出力を変数に保存し、そのデータを元のデータフレームに追加することです。

保険プランの期間を計算してその値を返す関数を作成しました。これは、サンプルデータセットで正常に機能します。より大きなデータセットを使用すると、「サイズのベクトルを割り当てることができません...」というエラーが発生します。多くの人がRAMを増やすことを勧めていることは知っていますが、私はすでに16GBのメモリを持っており、データセット全体がRにロードされているので、コンピュータは7.7GBのメモリしか使用していないと言っています。データセットには最大1,100万レコードの44列があるので、データの列をもう1つ追加すると8GBのメモリがどのように消費されるのかわかりません。

正しい方向のどのポイントでも素晴らしいでしょう。


以下は私が使用している関数です:

get_term_length <- function(row_data){

    # convert values to dates
    expiration_date <- as.Date( row_data[42] )
    start_date <- as.Date( row_data[43] )
    cancellation_date <- as.Date( row_data[44] )

    # check to see if the cancellation date is NA - just use entire policy length
    if( is.na(cancellation_date) ){
        return( expiration_date - start_date) )
    }

    # check to see if policy was cancelled early
    if(cancellation_date < expiration_date){
        return( cancellation_date - start_date )
    }

    # the policy was for the entire term
    else{
        return( expiration_date - start_date )
    }

}

私は次のように呼び出して関数を実行しています:

tmp <- apply(policy_data, 1, get_term_length)
4

3 に答える 3

5

data.table@Dwinによって示唆された解決策

 library(data.table)
 policy_data <- as.data.table(policy_data)

  # set the date  columns to be  IDate (the exact form of this will depend
  # on the format they are currently in

  policy_data[, cancellation_date := as.IDate(cancellation_date)]
  policy_data[, start_date := as.IDate(start_date)]
  policy_data[, end_date := as.IDate(end_date)]
  # create a column which is an indicator for NA 

  policy_data[, isna := is.na(cancellation_date)]


  setkey(policy_data, isna)

  policy_data[J(TRUE), tmp := expiration_date - start_date]
  policy_data[J(FALSE), tmp := pmin(cancellation_date - start_date, expiration_date-start_date)]   
于 2012-10-15T05:02:16.210 に答える
4

「経験則」では、作業している最大のオブジェクトの3倍の連続RAMが必要になるため、より頻繁に再起動し、システムで実行されている他のアプリケーションの数を制限する必要があります。32 GBのハードウェアにかなり満足しており、サイズが5〜6GBのデータオブジェクトに基づく回帰モデルに取り組んでいます。

(私も、データの列を追加するのにかかる時間に一般的に不満があるため、テーブル操作のために、多くの場合ave()関数を使用して「外部」または「並列」ベクトルを作成することがあります。またはサブセットを使用します()-sのデータ。)Rの達人は、まだ発表された解決策なしでこれに取り組んでいます。Matthew Dowleは、「[」操作に異なるセマンティクスを必要とする代わりに、それを解決する(そして非常に高速な)「data.table」パッケージを開発しました。

メモリ要件について説明している他の投稿をここで見つけることができます。最も頻繁に投票されるのはおそらく次 のとおりです。Rセッションで使用可能なメモリを管理するためのトリック。data.tableパッケージがそこの回答のどこにも言及されていないことに少し驚いています。

編集:あなたが受け入れた答えを見ました(これは実際にはデータのサブセットを操作するインスタンスです)が、以前と同じ結果ではないと思います。その結果を得るには、次のようなものが必要になります。

tmp <- with(policy_data, 
          ifelse( is.na(cancellation_date), expiration_date - start_date , # else
            pmin(as.Date(cancellation_date)-as.Date(start_date),
                 as.Date(expiration_date)-as.Date(start_date)
                 ))

関数を正しく機能さpminせたい場合は、で「na.rm=TRUE」を使用しないでください。ifelse

于 2012-08-09T21:22:37.733 に答える
3

data.frame全体が必要なようには見えません。必要な3つの列を抽出するだけで、ほとんどのメモリが元に戻ります。

tmp <- with(policy_data, 
            pmin(as.Date(cancellation_date)-as.Date(start_date),
                 as.Date(expiration_date)-as.Date(start_date),
                 na.rm=TRUE))
于 2012-08-09T21:31:28.110 に答える