4

このデータをグループ化したいのですが、グループ化するときにいくつかの列に異なる関数を適用します。

ID  type isDesc isImage
1   1    1      0
1   1    0      1
1   1    0      1
4   2    0      1
4   2    1      0
6   1    1      0
6   1    0      1
6   1    0      0

ID、列isDescでグループ化し、isImage合計できるようにしたいのですが、typeの値をそのまま取得したいです。typeデータセット全体で同じになります。結果は次のようになります。

ID  type isDesc isImage
1   1    1      2
4   2    1      1
6   1    1      1

現在、私は使用しています

library(plyr)
summarized = ddply(data, .(ID), numcolwise(sum))

ただし、すべての列を合計するだけです。使う必要はありませんがddply、仕事に良いと思うなら使い続けたいです。data.tableライブラリも代替手段です

4

1 に答える 1

6

使用data.table

require(data.table)
dt <- data.table(data, key="ID")
dt[, list(type=type[1], isDesc=sum(isDesc), 
                  isImage=sum(isImage)), by=ID]

#    ID type isDesc isImage
# 1:  1    1      1       2
# 2:  4    2      1       1
# 3:  6    1      1       1

使用plyr

ddply(data , .(ID), summarise, type=type[1], isDesc=sum(isDesc), isImage=sum(isImage))
#   ID type isDesc isImage
# 1  1    1      1       2
# 2  4    2      1       1
# 3  6    1      1       1

編集:data.table 'sを使用.SDcolsすると、合計する列が多すぎて、他の列が最初の値を取得できない場合にこれを行うことができます。

dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)]
dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)]
> dt2[dt1]
#    ID type isDesc isImage
# 1:  1    1      1       2
# 2:  4    2      1       1
# 3:  6    1      1       1

.SDcolsの引数として、列名または列番号を指定できます。例:.SDcols=c("type")も有効です。

于 2013-03-15T13:54:13.227 に答える