依存サブセットからのビッグデータフレームの各行の複数の新しい集計

デソラン

Rに大きなデータフレームがあり、既存の列に基づいていくつかの新しい列を作成したいと思います。ただし、各行について、新しい値は他のいくつかの行にも依存します。

ここにいくつかのダミーデータがあります

colnames <- c('date', 'docnr', 'clientid', 'values')
docnr <- c(1,2,3,4,5,6)
dates <- c('2017-01-01', '2017-02-01', '2017-03-01', '2017-04-01','2017-01-05', '2017-02-05')
clients <- c(1,1,1,1,2,2)
values <- c(10,14,4,7,9,19)
df <- data.frame(cbind(dates, docnr, clients, values))
names(df) <- colnames
df$date <- as.Date(df$date, format = "%Y-%m-%d")

df
        date docnr clientid values
1 2017-01-01     1        1     10
2 2017-02-01     2        1     14
3 2017-03-01     3        1      4
4 2017-04-01     4        1      7
5 2017-01-05     5        2      9
6 2017-02-05     6        2     19

私がやりたいのは、すべての行(docnrによって一意に識別される)が日付とクライアントIDを取得し、同じクライアントIDと以前の日付を持つ他のすべての行を見つけることです。

次に、このサブセットからいくつかのことを計算したいと思います。たとえば、このサブセットの行の総数と、このサブセットのすべての値の合計が必要です。

したがって、このサンプルデータの場合、次のことを期待します。

        date docnr clientid values counts totals
1 2017-01-01     1        1     10      0      0
2 2017-02-01     2        1     14      1     10
3 2017-03-01     3        1      4      2     24
4 2017-04-01     4        1      7      3     28
5 2017-01-05     5        2      9      0      0
6 2017-02-05     6        2     19      1      9

現時点では、forループを使用しています。

counts <- numeric(0)
totals <- numeric(0)
for (i in 1:nrow(df)) {
  tmp <- df[df$date< df$date[i] & df$clientid== df$clientid[i],
               c( "date", "docnr","value")]
  cnt <- nrow(tmp)
  tot <- sum(tmp$value)
  counts[i] <- res
  totals[i] <- tot
}
df$counts <- counts
df$totals <- totals

このループは、700k行のデータフレームでは明らかに非常に低速です(まだ完了まで実行されていません)。を使用した並列実装doSNOWは、拡張性がそれほど高くないようです。

でSQLクエリを使用しようとしましたsqldfが、サブクエリは一度に1つの値しか返すことができません。つまり、定義する新しい列ごとにクエリを実行します(後でさらに多くの派生列を追加したい)。

SQLオブジェクトを使用したソリューションに出くわしました(サブクエリから複数の値を取得することは可能ですか?)が、オブジェクトはRのsqldfで機能しませんでした。2番目のクエリには最初のクエリの情報が必要なため、結合の使用は機能しません。

私はRを始めたばかりなので(SQLにもあまり詳しくないので)、誰かがこれを行うためのより効率的な方法を知っていれば、私は大いに義務付けられます。

lmo

これはave、グループ化に使用する2行のベースRコードです。

# get counts
df$counts <- ave(df$docnr, df$clientid, FUN=seq_along) - 1L
# get lagged cumulative sum
df$totals <- ave(df$values, df$clientid, FUN=function(x) c(0, head(cumsum(x), -1)))

これは

df
        date docnr clientid values counts totals
1 2017-01-01     1        1     10      0      0
2 2017-02-01     2        1     14      1     10
3 2017-03-01     3        1      4      2     24
4 2017-04-01     4        1      7      3     28
5 2017-01-05     5        2      9      0      0
6 2017-02-05     6        2     19      1      9

上記のコードは、あなたが説明したデータに対して十分に速く実行されると思います。ただし、これdata.tableは、数十億行のデータを処理するための推奨パッケージです。上記のコードのアナログは次のようにdata.tableなります

library(data.table)
setDT(df)[, c("counts", "totals") := .(seq_len(.N) - 1L, shift(cumsum(values), fill=0)),
          by=clientid]

どこseq_len(.N)の役割を満たすseq_alongshiftの役割埋めるc(0, head(cumsum(x), -1))前のコードでは。

これにより、上記と同じ値のdata.tableが返されます。

df
         date docnr clientid values counts totals
1: 2017-01-01     1        1     10      0      0
2: 2017-02-01     2        1     14      1     10
3: 2017-03-01     3        1      4      2     24
4: 2017-04-01     4        1      7      3     28
5: 2017-01-05     5        2      9      0      0
6: 2017-02-05     6        2     19      1      9

データ

df <- 
structure(list(date = structure(c(17167, 17198, 17226, 17257, 
17171, 17202), class = "Date"), docnr = c(1, 2, 3, 4, 5, 6), 
    clientid = c(1, 1, 1, 1, 2, 2), values = c(10, 14, 4, 7, 
    9, 19)), .Names = c("date", "docnr", "clientid", "values"
), row.names = c(NA, -6L), class = "data.frame")

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

データフレーム列のサブセットに依存する新しい列を取得する方法

分類Dev

1つのデータフレームを別のデータフレームの各行の値と合計距離列でサブセット化します

分類Dev

データフレームサブセットからの因子変数の効率的なサンプリング

分類Dev

データフレームのサブセットの計算

分類Dev

複数のデータフレームから共通の行をサブセット化する

分類Dev

R-複数のデータフレームから特定の行をサブセット化する方法

分類Dev

複数の条件を持つデータフレームからの条件付きサブセット

分類Dev

複数の条件ステートメントを含む文字引数を、データフレーム名に依存しない関数の論理からサブセットに変換します

分類Dev

1つのデータフレームからのn行のサブセットを複数の他のデータフレームの異なるn行のサブセットにバインドします

分類Dev

同じ変数の複数のサブセットを使用して新しいデータフレームを作成します

分類Dev

複数のデータセットとサブレポートからのSSRS合計値

分類Dev

Rの値と等しくないサブセットをフィルタリングして、複数のデータフレームを作成します

分類Dev

データフレームのすべてのサブセットの係数を計算します

分類Dev

個別のデータフレームのフィルタリングとサブセット化からデータフレームを作成しますか?

分類Dev

複数の間隔を使用してデータフレームを複数のサブデータフレームにサブセット化する方法

分類Dev

forループでサブセット化し、そのループから複数のデータフレームを作成します。

分類Dev

複数の列に基づいてデータフレーム内のサブセットの合計を計算する方法

分類Dev

特定の列のデータフレームから各行の複数の平均を計算します

分類Dev

条件に基づいてマスターデータフレームのサブセットである複数の新しいデータフレームを作成し、それらに一意の名前を動的に付けるにはどうすればよいですか?

分類Dev

パンダデータフレームのサブセットの複数のプロットのforループ

分類Dev

マルチインデックスデータフレームからデータのサブセットを抽出し、列の差を計算します

分類Dev

別のデータフレームをサブセット化し、サフィックスを追加して、ループ内に複数の新しいデータフレームを作成します

分類Dev

パンダ:列の複数のサブセットがゼロ以外のデータフレームから行を返します

分類Dev

別のデータフレームからの2つの条件に基づいてデータフレームをサブセット化します

分類Dev

Daskデータフレーム-各行からの複数の行

分類Dev

サブセットがデータフレームのサブセット引数の欠落を気にしないのはなぜですか?

分類Dev

データフレームの1行からデータのサブセットを取得します

分類Dev

複数の不等式を使用した R のサブセット データフレーム

分類Dev

rのデータフレームからレコードのサブセットを削除します

Related 関連記事

  1. 1

    データフレーム列のサブセットに依存する新しい列を取得する方法

  2. 2

    1つのデータフレームを別のデータフレームの各行の値と合計距離列でサブセット化します

  3. 3

    データフレームサブセットからの因子変数の効率的なサンプリング

  4. 4

    データフレームのサブセットの計算

  5. 5

    複数のデータフレームから共通の行をサブセット化する

  6. 6

    R-複数のデータフレームから特定の行をサブセット化する方法

  7. 7

    複数の条件を持つデータフレームからの条件付きサブセット

  8. 8

    複数の条件ステートメントを含む文字引数を、データフレーム名に依存しない関数の論理からサブセットに変換します

  9. 9

    1つのデータフレームからのn行のサブセットを複数の他のデータフレームの異なるn行のサブセットにバインドします

  10. 10

    同じ変数の複数のサブセットを使用して新しいデータフレームを作成します

  11. 11

    複数のデータセットとサブレポートからのSSRS合計値

  12. 12

    Rの値と等しくないサブセットをフィルタリングして、複数のデータフレームを作成します

  13. 13

    データフレームのすべてのサブセットの係数を計算します

  14. 14

    個別のデータフレームのフィルタリングとサブセット化からデータフレームを作成しますか?

  15. 15

    複数の間隔を使用してデータフレームを複数のサブデータフレームにサブセット化する方法

  16. 16

    forループでサブセット化し、そのループから複数のデータフレームを作成します。

  17. 17

    複数の列に基づいてデータフレーム内のサブセットの合計を計算する方法

  18. 18

    特定の列のデータフレームから各行の複数の平均を計算します

  19. 19

    条件に基づいてマスターデータフレームのサブセットである複数の新しいデータフレームを作成し、それらに一意の名前を動的に付けるにはどうすればよいですか?

  20. 20

    パンダデータフレームのサブセットの複数のプロットのforループ

  21. 21

    マルチインデックスデータフレームからデータのサブセットを抽出し、列の差を計算します

  22. 22

    別のデータフレームをサブセット化し、サフィックスを追加して、ループ内に複数の新しいデータフレームを作成します

  23. 23

    パンダ:列の複数のサブセットがゼロ以外のデータフレームから行を返します

  24. 24

    別のデータフレームからの2つの条件に基づいてデータフレームをサブセット化します

  25. 25

    Daskデータフレーム-各行からの複数の行

  26. 26

    サブセットがデータフレームのサブセット引数の欠落を気にしないのはなぜですか?

  27. 27

    データフレームの1行からデータのサブセットを取得します

  28. 28

    複数の不等式を使用した R のサブセット データフレーム

  29. 29

    rのデータフレームからレコードのサブセットを削除します

ホットタグ

アーカイブ