Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的群条件子集_R_Subset - Fatal编程技术网

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()