回答:
1つの方法は、データを逆ソートし、duplicated
すべての重複を削除するために使用することです。私にとって、この方法は、applyを使用する方法よりも概念的に簡単です。私もそれは非常に高速であるべきだと思います。
# Some data to start with:
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# id var
# 1 2
# 1 4
# 2 1
# 2 3
# 3 5
# 4 2
# Reverse sort
z <- z[order(z$id, z$var, decreasing=TRUE),]
# id var
# 4 2
# 3 5
# 2 3
# 2 1
# 1 4
# 1 2
# Keep only the first row for each duplicate of z$id; this row will have the
# largest value for z$var
z <- z[!duplicated(z$id),]
# Sort so it looks nice
z <- z[order(z$id, z$var),]
# id var
# 1 4
# 2 3
# 3 5
# 4 2
編集:上記の逆の並べ替えは、並べ替えさえする必要がないことを実感しましたid
。z[order(z$var, decreasing=TRUE),]
代わりに使用するだけで、同様に機能します。
もう1つ考えます... var
列が数値の場合、id
昇順であるvar
が降順であるように並べ替える簡単な方法があります。これにより、最後に並べ替える必要がなくなります(並べ替えを希望する場合でも)。
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# Sort: id ascending, var descending
z <- z[order(z$id, -z$var),]
# Remove duplicates
z <- z[!duplicated(z$id),]
# id var
# 1 4
# 2 3
# 3 5
# 4 2
実際には、同じIDを持つ要素から最大の要素を選択する必要があります。そのためにはddply
、パッケージplyrから使用できます。
> dt<-data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,4,2))
> ddply(dt,.(id),summarise,var_1=max(var))
id var_1
1 1 4
2 2 3
3 3 4
4 4 2
unique
そしてduplicated
あなたのケースで、あなただけではない記録し、重複したIDを持って、重複レコードを除去するためのものです。
更新:追加の変数がある場合のコードは次のとおりです。
> dt<-data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,4,2),bu=rnorm(6))
> ddply(dt,~id,function(d)d[which.max(d$var),])
base-Rソリューションにはsplit
、次のようなが含まれます。
z<-data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,4,2))
do.call(rbind,lapply(split(z,z$id),function(chunk) chunk[which.max(chunk$var),]))
split
データフレームをチャンクのリストに分割し、最大値を使用して単一行に切り取りを実行し、単一行do.call(rbind,...)
のリストを再びデータフレームに縮小します。
使用したい ave
dt<-data.frame(id=c(1,1,2,2,3,4),var=c(2,4,3,3,4,2))
## use unique if you want to exclude duplicate maxima
unique(subset(dt, var==ave(var, id, FUN=max)))
例のように、列varが既に昇順である場合、データフレームを並べ替える必要はありません。duplicated
引数を渡す関数を使用するだけfromLast = TRUE
であるため、最後の要素を保持して、複製は裏面から考慮されます。
z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
z[!duplicated(z$id, fromLast = TRUE), ]
id var
2 1 4
4 2 3
5 3 5
6 4 2
それ以外の場合は、最初に昇順でデータフレームを並べ替えます。
z <- z[order(z$id, z$var), ]
z[!duplicated(z$id, fromLast = TRUE), ]
dplyr
パッケージの使用:
library(dplyr)
z %>%
group_by(id) %>%
summarise(var = max(var))
Source: local data frame [4 x 2]
id var
1 1 4
2 2 3
3 3 5
4 4 2