21

したがって、例として次のレイアウトを持つRのデータセットがあります。

ID Date Tally
1 2/1/2011 1
2 2/1/2011 2
3 2/1/2011 3
1 2/1/2011 4
2 2/1/2011 5
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

投稿IDの最後のインスタンスを除くすべてのインスタンスを削除したい。現在、オンラインで見つけることができるものはすべて、使用している関数は、最初のインスタンスを除くすべてを削除しています。

したがって、私の新しいデータフレームは次のようになります。

ID Date Tally
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9

どうすればよいですか?現在、私は最初のインスタンスしか保持できません。私はそれが反対のことをしたいですか?何か助けはありますか?

4

4 に答える 4

26

これは、「fromLast」パラメータを使用するための標準的なケースではないでしょうduplicatedか。

 dat[ !duplicated(dat[, c("ID", "Date")], fromLast=T),]
#---------
  ID     Date Tally
6  1 2/1/2011     6
7  3 2/1/2011     7
8  4 2/1/2011     8
9  2 2/1/2011     9

あなたの例は、複製のテストで「日付」列が必要かどうかを判断するのに十分なほど豊富ではなかったので、おそらく単純化することができます。duplicateddata.frameメソッドがあることを説明するために残しておきます。グループを比較している場合は、セットの補集合に簡単にアクセスできるため、私はそれ!duplicatedを好みます。unique

于 2013-03-26T17:00:41.390 に答える
14

!rev(duplicated(rev(ID)))最後の一意の発生を除くすべてを除外するために使用します。

データセットをフィルタリングするには、dataset[!rev(duplicated(rev(dataset$ID))),]

于 2013-03-26T16:15:54.247 に答える
4

結合を使用して、data.table設定できますmult = 'last'

例えば

library(data.table)
DT <- data.table(DF, key = 'id')

# join with the unique ID values
DT[unique(DT[,list(ID)]), mult= 'last']

   ID     Date Tally
1:  1 2/1/2011     6
2:  2 2/1/2011     9
3:  3 2/1/2011     7
4:  4 2/1/2011     8

一意のIDを知っている場合は、次のいずれかを実行することもできます

DT[.(1:4), mult='last']
DT[list(1:4), mult = 'last']
于 2013-03-26T22:26:50.687 に答える
4

dplyrを使用します。

data <- data %>%
  group_by(ID) %>%
  slice(which.max(Tally))
于 2016-10-18T18:10:52.697 に答える