2

この質問はdata.table、同名のRパッケージのクラスに関連しています。

オブジェクトdata.tableを指定すると、その列のいくつかの値に従ってスライスに分割したいと思います。

私がしなければならないことを明確にするために、例を挙げます。

これが入力であるとしますdata.table

dataf <- data.frame(list(
  T = c(1.80,1.81,1.82,1.83,1.85,1.87,1.90,1.95,2.00),
  A = c(1,0,1,1,1,0,1,1,0),
  B = c(0,0,0,0,0,0,1,0,0),
  C = c(0,1,0,1,1,0,1,1,0),
  D = c(0,0,1,1,1,0,0,1,0))
)
datat <- data.table(dataf)
datat
#       T A B C D
# 1: 1.80 1 0 0 0
# 2: 1.81 0 0 1 0
# 3: 1.82 1 0 0 1
# 4: 1.83 1 0 1 1
# 5: 1.85 1 0 1 1
# 6: 1.87 0 0 0 0
# 7: 1.90 1 1 1 0
# 8: 1.95 1 0 1 1
# 9: 2.00 0 0 0 0

目標nは、選択した列の値に基づいて、このテーブルをサブテーブルに分割することです(を使用n = 0, ..., ncol(datat) - 1)。

この入力の場合、アンカー列Cおよびを選択するとD、出力は次のようになります。

# $`0|0`
#       T A B C D
# 1: 1.80 1 0 0 0

# $`1|0`
#       T A B C D
# 1: 1.81 0 0 1 0

# $`0|1`
#       T A B C D
# 1: 1.82 1 0 0 1

# $`1|1`
#       T A B C D
# 1: 1.83 1 0 1 1
# 2: 1.85 1 0 1 1

# $`0|0`
#       T A B C D
# 1: 1.87 0 0 0 0

# $`1|0`
#       T A B C D
# 1: 1.90 1 1 1 0

# $`1|1`
#       T A B C D
# 1: 1.95 1 0 1 1

# $`0|0`
#       T A B C D
# 1: 2.00 0 0 0 0

上記の例から推測できるように、分割条件は次のとおりです。

  • 選択した列の値が前の行の値と異なる?

重要: この例では、「値」という単語は、列の値のペアとして意図されている必要があります。

:

私はこの出力構造に (2 番目の目標) 1 つ (または 2 つ) の関数をこのサブテーブルに適用し、それらの出力を取得し、それらの一般的な名前でそれらを集計 (たとえば、合計、マージ、またはその他の操作) する必要があると考えました。要素リスト (つまり0|0with 0|01|0with 1|0etc. など)。

この 2 番目の目標を可能にする、より適した、またはより簡単な出力構造があると思われる場合は、提案を歓迎します。

大きなテーブルを処理する必要があるため、明らかに、ソリューションのパフォーマンスは重要です。

残念ながら、私は自分自身をdata.tableパッケージの初心者だと考えています。実際、私はそれについていくつかのことしか知りません: 列名でサブセット化する方法など..

新しいことを学ぶのに役立つので、あなたの助けは大歓迎です。前もって感謝します。

4

1 に答える 1

3

私は次のようにそれをrle行いsplitます:

ids <- do.call(paste, c(datat[, 4:5], sep="|"))
rle.ids <- rle(ids)
datat.spl <- split(datat, rep(seq_along(rle.ids$values), rle.ids$lengths))
names(datat.spl) <- rle.ids$values

あなたの目的は、これらのサブテーブルをグループ化/集約することによってこれらのサブテーブルに関数を適用することであるため、メモセクションを読んでください。そのように追加の列を追加することをお勧めします。data.table

datat[, grp1 := do.call(paste, c(datat[, 4:5], sep="|"))]

必要に応じて、次のように別のグループを追加することもできます。

datat[, grp2 := rep(seq_along(rle.ids$values), rle.ids$lengths)]

すべての「0 | 0」をグループ化する場合は、によってサブセット化しgrp1ます。

# example
datat[, list(s.A = sum(A)), by = grp1]

「0 | 0」の個別のセットごとに集計を実行する場合は、によってサブセット化しgrp2ます。

# example
datat[, list(grp1 = grp1[1], s.A = sum(A)), by = grp2]

お役に立てれば。

于 2013-04-16T12:27:53.740 に答える