10

変数 id に基づいてデータセットから重複した観測を削除しようとしています。ただし、観測の削除は次のルールに基づいて行う必要があります。以下の変数は、id、世帯主の性別 (男性 1、女性 2)、および世帯主の年齢です。ルールは次のとおりです。世帯に男性と女性の両方の世帯主がいる場合は、女性の世帯主の観測を削除します。世帯主が男性 2 人または女性 2 人である場合は、若い世帯主の観察を削除します。データセットの例を以下に示します。

id = c(1,2,2,3,4,5,5,6,7,8,8,9,10)
sex = c(1,1,2,1,2,2,2,1,1,1,1,2,1)
age = c(32,34,54,23,32,56,67,45,51,43,35,80,45)
data = data.frame(cbind(id,sex,age))
4

2 に答える 2

13

これを行うには、最初に を並べ替えて、data.frameそれぞれの目的のエントリidが最初になるようにしてから、重複する を含む行を削除しますid

d <- with(data, data[order(id, sex, -age),])
#    id sex age
# 1   1   1  32
# 2   2   1  34
# 3   2   2  54
# 4   3   1  23
# 5   4   2  32
# 7   5   2  67
# 6   5   2  56
# 8   6   1  45
# 9   7   1  51
# 10  8   1  43
# 11  8   1  35
# 12  9   2  80
# 13 10   1  45
d[!duplicated(d$id), ]
#    id sex age
# 1   1   1  32
# 2   2   1  34
# 4   3   1  23
# 5   4   2  32
# 7   5   2  67
# 8   6   1  45
# 9   7   1  51
# 10  8   1  43
# 12  9   2  80
# 13 10   1  45
于 2013-03-22T18:04:40.373 に答える
8

ではdata.table、これは「複合クエリ」で簡単です。データを読み込むときにデータを並べ替えるには、読み込むときに「キー」を「id,sex」として設定します (特定の ID で女性の値が男性の値の前に来る場合に必要です)。

> library(data.table)
> DT <- data.table(data, key = "id,sex")
> DT[, max(age), by = key(DT)][!duplicated(id)]
    id sex V1
 1:  1   1 32
 2:  2   1 34
 3:  3   1 23
 4:  4   2 32
 5:  5   2 67
 6:  6   1 45
 7:  7   1 51
 8:  8   1 43
 9:  9   2 80
10: 10   1 45
于 2013-03-22T18:17:01.387 に答える