按列拆分多个数据帧,并保存为不同的数据帧

Split many dataframes by a column, and save as different dataframes

我有很多数据框。我想根据列中的值(一个因素)拆分它们。然后我想将拆分结果存储在具有特定名称的单独数据框中。

为了 mrp,考虑一些生成的数据,

for (i in 1:10) {
assign(paste("df_",i,sep = ""), data.frame(x = rep(1,12), y  = c(rep("a",4),rep("b",4),rep("c",4))))
}

这里我们有 10 个 dfs,df_1,df_2... 到 df_10。 (真实数据与生成数据相似,但在真实数据中,每个 df 的 z 列不同)。

现在,我想将 dfs 拆分为 'y'(第 2 列)。

对于 1 个 df,我可以执行以下操作;

splitdf <- split(df_1,df_1$y)
namessplit <- c("a","b","c")
for (i in 1:length(splitdf)) {
  assign(paste("df_1_",namessplit[[i]],sep = ""),splitdf[[i]])
}

虽然这适用于 1 个 df,但我如何才能对所有 df 执行此操作?

非常感谢!

不建议在全局环境中创建多个对象,但如果我们想知道如何从嵌套列表创建对象 - 循环外部列表序列,然后在内部列表序列中,paste assign 提取的内部列表元素的对应名称

lst1 <- lapply(mget(ls(pattern = "^df_\d+$")), \(x) split(x, x$y))
for(i in seq_along(lst1)) {
   for(j in seq_along(lst1[[i]]))  {
   assign(paste0(names(lst1)[i], "_", names(lst1[[i]][j])), lst1[[i]][[j]])
  }
}

-检查在全局环境中创建的对象

> ls(pattern = "^df_\d+_[a-z]+$")
 [1] "df_1_a"  "df_1_b"  "df_1_c"  "df_10_a" "df_10_b" "df_10_c" "df_2_a"  "df_2_b"  "df_2_c"  "df_3_a"  "df_3_b"  "df_3_c"  "df_4_a" 
[14] "df_4_b"  "df_4_c"  "df_5_a"  "df_5_b"  "df_5_c"  "df_6_a"  "df_6_b"  "df_6_c"  "df_7_a"  "df_7_b"  "df_7_c"  "df_8_a"  "df_8_b" 
[27] "df_8_c"  "df_9_a"  "df_9_b"  "df_9_c"