将 R 中的 DataFrame 按年份的重复值按评级的最低值进行子集化

Subsetting DataFrame in R by duplicate values for Year by lowest value for Rating

我有一个看起来像这样的数据框

> fitchRatings
               Country Month Year FitchLongTerm LongTermTransformed
1            Abu Dhabi     7 2007            AA                  22
2               Angola     5 2012           BB-                  12
3               Angola     5 2011           BB-                  12
4               Angola     5 2010            B+                  11
5            Argentina     7 2010             B                  10
6            Argentina    12 2008            RD                   3
7            Argentina     8 2006            RD                   3
8            Argentina    12 2005            RD                   3
9            Argentina     6 2005           DDD                   2
10           Argentina     1 2005             D                   0

如您所见,对于某些国家/地区,一年有多个观测值。我想对 DF 进行子集化,以便我只为每个国家/地区年份保留一个观测值,而我想要保留的观测值是 "LongTermTransformed" 的最小值。

在此数据集中,Country 和 LongTermTransformed 是因子,Year 是整数。

提前致谢。

有很多方法可以根据列中的最小值对行进行子集分组。一种选择是在将 'LongTermTransformed' 转换为 'numeric' 之后,使用 which.min 获取 'min' 值的索引。我们可以使用 slice 对索引标识的行进行子集化。

library(dplyr)
fitchRatings %>%
          group_by(Country, Year) %>%
          slice(which.min(as.numeric(as.character(LongTermTransformed))))

或者我们可以使用与 data.table 类似的选项。不同之处在于我们将 'data.frame' 转换为 'data.table' (setDT) 并使用 .SD 进行子集化。

library(data.table)#v1.9.5+
setDT(fitchRatings)[, 
 .SD[which.min(as.numeric(levels(LongTermTransformed))[LongTermTransformed])],
              by = .(Country, Year)]

另一个 data.table 选项只是按 LongTermTransformed 排序,并使用 unique

获取每个 CountryYear 的第一个值
library(data.table)
unique(setDT(fitchRatings)[order(as.numeric(as.character(LongTermTransformed)))], by = c("Country", "Year"))

或使用dplyr

library(dplyr)
fitchRatings %>%
  arrange(as.numeric(as.character(LongTermTransformed))) %>%
  distinct(Country, Year)