将 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
获取每个 Country
和 Year
的第一个值
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)
我有一个看起来像这样的数据框
> 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
Country
和 Year
的第一个值
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)