基于行值的子集数据帧并在 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
.
中循环 1990
到 2020
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
我有一个非常大的数据框,其中有一列是年份。
假设这个 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
.
1990
到 2020
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