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

子集R数据帧取决于重复变量的值,r,dataframe,subset,plyr,data.table,R,Dataframe,Subset,Plyr,Data.table,如何将下面的示例数据帧子集为仅返回一个 观察每个id最早发生的时间[即分钟(年)] 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) 这就是我想要回报的: df2 year qty id 2000 100 A 2001

如何将下面的示例数据帧子集为仅返回一个 观察每个id最早发生的时间[即分钟(年)]

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)
这就是我想要回报的:

df2

year qty id
2000 100  A
2001 100  C
2002 200  D
2003 100  E
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
>df.sort.year df.sort.year[!重复(df$id),]
年份数量id
1 2000 100 A
3 2001 100 C
2002年4月200日
5 2003 100 E
6 2004 500华氏度
使用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
库(plyr)
##确保第一行为最小值(年)

df您可以根据最小年份+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
df2-df2
#id年份数量
#1 A 2000 100
#2 C 2001 100
#3 D 2002 200
#4 E 2003 100
#5 F 2004 500

可能有一种更漂亮的方法可以做到这一点,但这正是我想到的

# 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
#使用which()获取每个id的索引,只保存第一个id

同样,对于大型data.tables,这可能更快:
DF[J(unique(DF[,id])),mult=“first”]
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
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
# 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