2012-06-26 4 views
9

次の例のデータフレームをサブセット化すると、最も早い時点で1つだけのデータが返されます[ 分(年)]ごとに?重複したIDの場合には2000年と2001年の「」IDの2つの観測がある上に、Iのみにサブセットデータフレームを希望例でサブセットR重複する変数の値を条件とするデータフレーム

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) 

最初のoccurance(IEを含めます2000年に)重複したIDの観測結果が表示されます。

df2 = subset(df, ???) 

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

df2 

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

どのような援助がいただければ幸いです。

答えて

9

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 
+0

大きな直感的なソリューション。どうもありがとうございました。 – MikeTP

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:Er、私はあなたが求めていたことを完全に誤解しました。私は完全さのためにここにこれを保持します。

編集2:

OK]をクリックして、ここでのソリューションです:その後、年によってソート(その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 
+0

を気にも、大規模なdata.tablesのために、これは速いかもしれ私は重複機能 – MikeTP

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として設定すると、最初の行が最低年であることが保証されます。

あなたは数量を取得するには、元のデータフレームと合併、その後、最小年間+ IDに集約することができます
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 
+2

を認識していませんでした、ありがとう: 'DF [J(ユニーク(DF [、ID]))、MULT = "first"] '。 –

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