如何将以下示例数据框子集化为仅返回一个 对最早出现的观察[即每个身份的分钟(年)?
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)
在上面的例子中,对于2000年和2001年的“A”id有两个观察结果。在重复id的情况下,我希望子集数据帧仅包括第一次出现(即2000)对重复身份证的观察。
df2 = subset(df, ???)
这就是我想要回归的内容:
df2
year qty id
2000 100 A
2001 100 C
2002 200 D
2003 100 E
2004 500 F
非常感谢任何协助。
答案 0 :(得分: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
答案 1 :(得分: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
编辑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
答案 2 :(得分: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将确保第一行是年中的最小值。
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
答案 3 :(得分: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