1

変数の重複値を含むデータフレーム(〜5000行、6列)がありidます。別の連続変数xがあり、その値を複製ごとに合計したいと思いますid。観測は時間に依存し、変数がyearあります。各複製の時系列で最初の観測を保持し、この最初の観測に後続の複製を追加しmonthたいと思います。id

私が持っているものに似たダミーデータを含めました:dat1。また、希望する結果の構造を示すデータセットも含めましたoutcome

私は2つの戦略を試しましたが、どちらも私が望むものをまったく与えてくれません(以下を参照)。最初の戦略では、の正しい値が得られますがx、年と月の列が失われます。最初の重複するすべてのid値について、これらを保持する必要があります。x2番目の戦略では、の値が正しく合計されません。

私の望ましい結果を得る方法についての提案は大歓迎です。

# dummy data set
set.seed(179)
dat1 <- data.frame(id = c(1234, 1321, 4321, 7423, 4321, 8503, 2961, 1234, 8564, 1234),
                   year = rep(c("2006", "2007"), each = 5),
                   month = rep(c("December", "January"), each = 5),
                   x = round(rnorm(10, 10, 3), 2))

# desired outcome
outcome <- data.frame(id = c(1234, 1321, 4321, 7423, 8503, 2961, 8564),
                      year = c(rep("2006", 4), rep("2007", 3)),
                      month = c(rep("December", 4), rep("January", 3)),
                      x = c(36.42, 11.55, 17.31, 5.97, 12.48, 10.22, 11.41))

# strategy 1:
library(plyr)
dat2 <- ddply(dat1, .(id), summarise, x = sum(x))

# strategy 2:
# partition into two data frames - one with unique cases, one with dupes
dat1_unique <- dat1[!duplicated(dat1$id), ]
dat1_dupes <- dat1[duplicated(dat1$id), ]

# merge these data frames while summing the x variable for duplicated ids
# with plyr
dat3 <- ddply(merge(dat1_unique, dat1_dupes, all.x = TRUE),
              .(id), summarise, x = sum(x))
# in base R
dat4 <- aggregate(x ~ id, data = merge(dat1_unique, dat1_dupes,
                  all.x = TRUE), FUN = sum)
4

2 に答える 2

5

私は異なる合計を取得しましたが、シードを忘れたのは b/c でした:

> dat1$x <- ave(dat1$x, dat1$id, FUN=sum)
> dat1[!duplicated(dat1$id), ]
    id year    month     x
1 1234 2006 December 25.18
2 1321 2006 December 15.06
3 4321 2006 December 15.50
4 7423 2006 December  7.16
6 8503 2007  January 13.23
7 2961 2007  January  7.38
9 8564 2007  January  7.21

(より安全のために、コピーで作業する方がよいでしょう。また、注文手順を追加する必要がある場合があります。)

于 2013-02-08T02:09:40.557 に答える
3

これを行うことができますdata.table(plyrよりも速く、メモリ効率が高くなります)

mult='first'を使用して自己結合を少し楽しみます。年と月の ID でキーイングすると、ID、年、月の順でソートされます。

library(data.table)
DT <- data.table(dat1, key = c('id','year','month'))


# setnames is required as there are two x columns that get renamed x, x.1
DT1 <- setnames(DT[DT[,list(x=sum(x)),by=id],mult='first'][,x:=NULL],'x.1','x')

またはより簡単なアプローチ:

DT = as.data.table(dat1)

DT[,x:=sum(x),by=id][!duplicated(id)]

     id year    month     x
1: 1234 2006 December 36.42
2: 1321 2006 December 11.55
3: 4321 2006 December 17.31
4: 7423 2006 December  5.97
5: 8503 2007  January 12.48
6: 2961 2007  January 10.22
7: 8564 2007  January 11.41
于 2013-02-08T01:17:37.937 に答える