-3

次のようなデータがあります。

Time ColA ColB ColC
0    1    10   5
1    3    7    15
2    0    8    9
3    3    4    5
4    4    5    6
7    10   23   4

データを同じサイズの時間間隔にグループ化し、各列の変数を合計したいと思います。たとえば、これは時間を 2 でグループ化した結果になります。

Time ColA ColB ColC
0    4    17   20
2    3    12   14
4    4    5    6
7    10   23   4

値が である新しい列を導入することでデータにラベルを付けることができましたfloor(data$Time/2)が、合計を行う方法が不明です。私が調べたパッケージのほとんどは、 1 つの列だけを要約しているように見えますが、私はすべての列を要約したいと考えています。

4

3 に答える 3

6

「data.table」パッケージを使用してください。構文ははるかに簡単で、実行時間は高速です。

### Load package
require(data.table)

### Set up variables; Create data.table
time <- c(0:4, 7)
ColA <- c(1, 3, 0, 3, 4, 10)
ColB <- c(10, 7, 8, 4, 5, 23)
ColC <- c(5, 15, 9, 5, 6, 4)
data <- data.table(time, ColA, ColB, ColC)

### Determine which columns we want to apply the function to
sum.cols <- grep("Col", names(data), value = T)   

### Sum each column within each group
data[, lapply(.SD, sum), by = floor(time / 2), .SDcols = sum.cols]

### Output:
    floor ColA ColB ColC
1:     0    4   17   20
2:     1    3   12   14
3:     2    4    5    6
4:     3   10   23    4

記号「.SD」は「データのサブセット」を指すことに注意してください。この場合、lapply 関数はデータ テーブルの列を繰り返し処理し、各列に関数 "sum" を適用します。各列内で、「フロア」変数のレベルごとに合計が計算されます。

于 2013-08-22T18:17:23.087 に答える
2

Ferdinand.Kraft の「複製」呼び出しが正しいことを実証するためだけに、元の単位で作成されている間隔を確認する要求を含む、要求されたものにほぼ間違いなく近い.

> aggregate(data[-1], list(cut(data$Time, include.lowest=TRUE, 
                            right=FALSE, breaks=seq(range(data$Time)[1], 
                                                  range(data$Time)[2]+1, 
                                                  by=2))) ,
                      sum)

  Group.1 ColA ColB ColC
1   [0,2)    4   17   20
2   [2,4)    3   12   14
3   [4,6)    4    5    6
4   [6,8]   10   23    4
于 2013-08-22T20:25:38.737 に答える
0

後世のために、これはOPの質問を解決するための「plyr」アプローチです。'data.table' 関数よりも 'plyr' 関数を使用する唯一の利点は、data.table 以外のオブジェクトを使用できることです。

セットアップ: まず、使用するデータは次のとおりです。

data <- read.table(text="
    Time ColA ColB ColC
    0    1    10   5
    1    3    7    15
    2    0    8    9
    3    3    4    5
    4    4    5    6
    7    10   23   4
    ", header=TRUE)

Ply-it : ここでは、データ フレームを入力 (d) し、データ フレームを出力 (d) するため、「ddply」関数を使用します。

ddply(
    data[, -1], 
    .(Time=floor(data$Time/2)), 
    colSums)

  #   Time ColA ColB ColC
  # 1    0    4   17   20
  # 2    1    3   12   14
  # 3    2    4    5    6
  # 4    3   10   23    4

'ddply' に、変数 'data' をデータ (時間を含む最初の列を除く) に使用し、 でインデックスを付けfloor(data$Time/2)、'colSums' を実行して残りの列の合計で列を作成するように指示しています。行の各グループに対して機能します。

于 2013-08-22T18:46:20.483 に答える