子集R数据帧取决于重复变量的值

Mik*_*eTP 9 r subset plyr dataframe data.table

如何将以下示例数据框子集化为仅返回每个id的最早出现[即min(year)]的一个观察值?

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)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,对于2000年和2001年的"A"id有两个观察结果.在重复id的情况下,我希望子集数据帧仅包括观察结果的第一次出现(即2000).重复的ID.

df2 = subset(df, ???)
Run Code Online (Sandbox Code Playgroud)

这就是我想要回归的内容:

df2

year qty id
2000 100  A
2001 100  C
2002 200  D
2003 100  E
2004 500  F
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

nei*_*fws 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
Run Code Online (Sandbox Code Playgroud)


Vin*_*nce 8

这是你在找什么?你的第二行看起来不对(这是重复的一年,而不是第一行).

> 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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 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
Run Code Online (Sandbox Code Playgroud)

或使用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
Run Code Online (Sandbox Code Playgroud)

  • 此外,对于大型data.tables,这可能更快:`DF [J(唯一(DF [,id])),mult ="first"]`. (2认同)