基于行值的子集数据帧并在 R 中创建新数据帧列表

subset dataframes based on rows values and create list of new data frames in R

我有一个非常大的数据框,其中有一列是年份。

假设这个 df 看起来像这样:

df <- data.frame(var1 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"),
                 ANO = c(1990, 1994, 2008, 2019, 1992, 2003, 2008, 2001, 2015, 1998, 2012, 1985, 1970, 1965))

我想根据带有 'smaller or equal than' 表达式的列 'ANO' 将这个大的 df 子集化为一个 dfs 列表。

重要:原始数据集的值范围为 c.1953 -2020,但我只需要 1990-2020 年的新 31 dfs。但是,各个 dfs 也需要有 1990 年之前的行。也就是说,新列表需要有 31 个 dfs (df_1990 - df_2020),例如,1990 年的 df 需要包括年份在 1990 年之前的所有行; df_1991,所有年份在 1991 年之前的行,依此类推直到 2020 年。

如果我指定要单独子集化的每个数据框,它就会起作用,如下所示:

new_list  <- list()
new_list$df_2010 <- df[df$ANO <= 2010,]
new_list$df_2011 <- df[df$ANO <= 2011,]
new_list$df_2012 <- df[df$ANO <= 2012,]

etc.

我想避免每次都复制 30 多行,所以我尝试了这样的方法:

years <- seq(from=1990, to=2020)

new_list <- list()

for(i in 1:length(years)) {
  
  df_loop <- df[df$ANO <= years[i],]
  
  new_list <- df_loop[[i]]
  
  }

但是它不起作用,我得到这个错误:

Error in .subset2(x, i, exact = exact) : subscript out of bounds

关于如何实现该结果有什么建议吗?

您可以使用 lapply 遍历 df$ANO 中的每个值,并使用 subset 选取小于或等于 ANO 的行。用 setNames 包装 lapply 函数以命名 sub-list 数据框。

编辑:如果您只想包含特定范围,您可以使用 lapply 中的 X 参数。这里我们只会在 lapply.

中循环 19902020
new_list <- setNames(lapply(sort(df$ANO)[sort(df$ANO) >= 1990], function(x) subset(df, ANO <= x)), paste0("df_", sort(df$ANO)[sort(df$ANO)>=1990]))

输出

new_list

$df_1990
  var1  ANO
1    A 1990

$df_1992
  var1  ANO
1    A 1990
5    E 1992

$df_1994
  var1  ANO
1    A 1990
2    B 1994
5    E 1992

$df_1998
   var1  ANO
1     A 1990
2     B 1994
5     E 1992
10    J 1998

$df_2001
   var1  ANO
1     A 1990
2     B 1994
5     E 1992
8     H 2001
10    J 1998

$df_2003
   var1  ANO
1     A 1990
2     B 1994
5     E 1992
6     F 2003
8     H 2001
10    J 1998

$df_2008
   var1  ANO
1     A 1990
2     B 1994
3     C 2008
5     E 1992
6     F 2003
7     G 2008
8     H 2001
10    J 1998

$df_2008
   var1  ANO
1     A 1990
2     B 1994
3     C 2008
5     E 1992
6     F 2003
7     G 2008
8     H 2001
10    J 1998

$df_2012
   var1  ANO
1     A 1990
2     B 1994
3     C 2008
5     E 1992
6     F 2003
7     G 2008
8     H 2001
10    J 1998
11    K 2012

$df_2015
   var1  ANO
1     A 1990
2     B 1994
3     C 2008
5     E 1992
6     F 2003
7     G 2008
8     H 2001
9     I 2015
10    J 1998
11    K 2012

$df_2019
   var1  ANO
1     A 1990
2     B 1994
3     C 2008
4     D 2019
5     E 1992
6     F 2003
7     G 2008
8     H 2001
9     I 2015
10    J 1998
11    K 2012