我试图写一个循环,在那里我可以按年份划分子帧,并将其存储在一个新的子帧中。
df1<-data.frame(ID=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5),
year=c("2021","2021","2022","2023","2021","2021","2022","2023","2021","2021","2022","2023",
"2021","2021","2022","2023","2021","2021","2022","2023"),
x=c(2,4,5,9,9,7,5,3,2,4,5,9,9,7,5,3,6,8,3,4))
字符串
我知道我可以使用subset()函数轻松地做到这一点,但最终我将使用30多年的大型数据集,所以我假设有一种比每年子集更简单的方法来做到这一点(比如在包含1990-2020年数据的数据集中)。基本上我希望结果类似于:
d2021<-subset(df1,year=="2021")
d2022<-subset(df1,year=="2022")
d2023<-subset(df1,year=="2023")
型
但是使用循环,所以我不必在我的实际数据集中为30年的每一年输入上述内容。我已经根据我在网上找到的东西尝试了以下方法,但它不起作用:
for(i in unique(df1$year)){
if(any(variable.names(df1)==i)){
assign(i,df1[,c(i)])
}
}
型
这就给了我输出
> i
[1] "2023"
型
我需要为每一年子集化和存储子集化的数据,因为我将做进一步的分析(MCP和RSF函数),其中数据将必须按年拆分,并且我将需要为每一年调用嵌套框架以在不同年份运行不同类型的分析。
我还知道split()函数会按年份拆分数据,但这会导致每年的列表,而不是新的列表。
x<-split(df1,df1$year)
str(x)
List of 3
$ 2021:'data.frame': 10 obs. of 3 variables:
..$ ID : num [1:10] 1 1 2 2 3 3 4 4 5 5
..$ year: chr [1:10] "2021" "2021" "2021" "2021" ...
..$ x : num [1:10] 2 4 9 7 2 4 9 7 6 8
$ 2022:'data.frame': 5 obs. of 3 variables:
..$ ID : num [1:5] 1 2 3 4 5
..$ year: chr [1:5] "2022" "2022" "2022" "2022" ...
..$ x : num [1:5] 5 5 5 5 3
$ 2023:'data.frame': 5 obs. of 3 variables:
..$ ID : num [1:5] 1 2 3 4 5
..$ year: chr [1:5] "2023" "2023" "2023" "2023" ...
..$ x : num [1:5] 9 3 9 3 4
型
1条答案
按热度按时间zphenhs41#
正如lotus和camille所指出的,最好只使用data.frames列表,但是如果您想将每个子集保存为单独的data.frame,则可以使用下面的代码。
字符串