9

次のサンプル データ フレームをサブセット化して、各 ID の最も早い発生 [つまり、min(年)] に対して 1 つの観測のみを返すにはどうすればよいですか?

id <- c("A", "A", "C", "D", "E", "F")
year <- c(2000, 2001, 2001, 2002, 2003, 2004)
qty  <- c(100, 300, 100, 200, 100, 500)
df=data.frame(year, qty, id)

上記の例では、2000 年と 2001 年の "A" id の 2 つの観測があります。ID が重複している場合、サブセット データ フレームには、観測の最初の発生 (つまり 2000 年) のみを含めたいと思います。重複した ID。

df2 = subset(df, ???)

これは私が返そうとしているものです:

df2

year qty id
2000 100  A
2001 100  C
2002 200  D
2003 100  E
2004 500  F

どんな援助でも大歓迎です。

4

4 に答える 4

9

最小年 + id で集計し、元のデータ フレームとマージして数量を取得できます。

df2 <- merge(aggregate(year ~ id, df1, min), df1)

# > df2
#   id year qty
# 1  A 2000 100
# 2  C 2001 100
# 3  D 2002 200
# 4  E 2003 100
# 5  F 2004 500
于 2012-06-26T23:25:40.320 に答える
8

これはあなたが探しているものですか?あなたの2番目の行は私には間違っているように見えます(最初の年ではなく、重複した年です)。

> duplicated(df$year)
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
> df[!duplicated(df$year), ]
  year qty id
1 2000 100  A
2 2001 300  A
4 2002 200  D
5 2003 100  E
6 2004 500  F

編集1:えー、私はあなたが求めていたものを完全に誤解しました。ただし、完全を期すためにこれをここに保持します。

編集2:

解決策は次のとおりです。年で並べ替えて(IDごとの最初のエントリが最も早い年になるように)、を使用しますduplicated。これが最も簡単な解決策だと思います。

> df.sort.year <- df[order(df$year), ]
> df.sort.year[!duplicated(df$id),  ]
  year qty id
1 2000 100  A
3 2001 100  C
4 2002 200  D
5 2003 100  E
6 2004 500  F
于 2012-06-26T23:21:05.237 に答える
5

plyrを使用する

library(plyr)
## make sure first row will be min (year)
df <- arrange(df, id, year)
df2 <- ddply(df, .(id), head, n = 1)


df2
##   year qty id
## 1 2000 100  A
## 2 2001 100  C
## 3 2002 200  D
## 4 2003 100  E
## 5 2004 500  F

またはdata.tableを使用します。キーをid、yearとして設定すると、最初の行が年の最小値になります。

library(data.table)
DF <- data.table(df, key = c('id','year'))
DF[,.SD[1], by = 'id']

##      id year qty
## [1,]  A 2000 100
## [2,]  C 2001 100
## [3,]  D 2002 200
## [4,]  E 2003 100
## [5,]  F 2004 500
于 2012-06-26T23:22:19.863 に答える
0

これを行うにはもっときれいな方法があるかもしれませんが、これが頭に浮かんだものです

# use which() to get index for each id, saving only first
first_occurance <- with(df, sapply(unique(id), function(x) which(id %in% x)[1]))
df[first_occurance,]
#  year qty id
#1 2000 100  A
#3 2001 100  C
#4 2002 200  D
#5 2003 100  E
#6 2004 500  F
于 2012-06-26T23:30:58.900 に答える