R中的群条件子集
我有一个看起来有点像这样的数据集R中的群条件子集,r,subset,R,Subset,我有一个看起来有点像这样的数据集 id year 1 2012 1 2014 1 2015 2 2014 2 2018 2 2019 3 2011 4 2010 基于这两个条件,我只想保留(1)每个id一次观察,(2)该id的最近一年。因此,例如,对于id 1,我只想保留2015行,对于id 2,我只想保留2019行,对于id 3和id 4,我在这两年中只保留一次观察,所以只需保留它们 我尝试了一些不同的方
id year
1 2012
1 2014
1 2015
2 2014
2 2018
2 2019
3 2011
4 2010
基于这两个条件,我只想保留(1)每个id一次观察,(2)该id的最近一年。因此,例如,对于id 1,我只想保留2015行,对于id 2,我只想保留2019行,对于id 3和id 4,我在这两年中只保留一次观察,所以只需保留它们
我尝试了一些不同的方法,如:
df1<-subset(df, interaction(df$id, max(df$year)))
但我总是出错
任何帮助都将不胜感激!先谢谢你 在按“id”分组后,我们可以对“年”为
max
的行进行切片
library(dplyr)
df %>%
group_by(id) %>%
slice(which.max(year))
# A tibble: 4 x 2
# Groups: id [4]
# id year
# <int> <int>
#1 1 2015
#2 2 2019
#3 3 2011
#4 4 2010
或使用base R
aggregate(year ~ id, df, FUN = max)
数据
df1)子集/重复使用注释末尾重复显示的df
,并假设其在id
内按年
排序(这是问题中显示的数据的情况),使用子集
和重复
。没有使用任何软件包
subset(df, !duplicated(id, fromLast = TRUE))
## id year
## 3 1 2015
## 6 2 2019
## 7 3 2011
## 8 4 2010
2)subset/ave另一种使用subset
的方法是使用ave
。这不依赖于正在排序的输入
subset(df, ave(year, id, FUN = max) == year)
## id year
## 3 1 2015
## 6 2 2019
## 7 3 2011
## 8 4 2010
3)根据其他基本方法是使用
根据。它返回一个数据帧列表,我们一起使用它
do.call("rbind", by(df, df$id, function(x) x[which.max(x$year), ]))
## id year
## 1 1 2015
## 2 2 2019
## 3 3 2011
## 4 4 2010
4)tapply如果可以返回以id为名称的年份向量,我们可以使用tapply
。同样,这只使用基本R
with(df, tapply(year, id, max))
## 1 2 3 4
## 2015 2019 2011 2010
我还建议使用aggregate
,但另一位回复者也提供了这个答案
注
行您应该分组,然后过滤
df %>%
group_by(id) %>%
filter(year == max(year)) %>%
ungroup()
与@akrun建议的使用slice的解决方案不同,这将返回每个id的最大年份的所有行。这取决于您的需要。这些不是唯一的列,但第一个代码肯定有效!非常感谢你!那么你应该把它标记为已接受
do.call("rbind", by(df, df$id, function(x) x[which.max(x$year), ]))
## id year
## 1 1 2015
## 2 2 2019
## 3 3 2011
## 4 4 2010
with(df, tapply(year, id, max))
## 1 2 3 4
## 2015 2019 2011 2010
Lines <- "id year
1 2012
1 2014
1 2015
2 2014
2 2018
2 2019
3 2011
4 2010"
df <- read.table(text = Lines, header = TRUE)
df %>%
group_by(id) %>%
filter(year == max(year)) %>%
ungroup()