【问题标题】:Split dataframe into certain number of groups in R在R中将数据框拆分为一定数量的组
【发布时间】:2021-09-28 02:01:41
【问题描述】:

我有一个包含 285000 条记录的数据框,我想将其拆分为 10 个数据框,以便我可以轻松保存和访问。我正在尝试像这样拆分它,但我不确定如何分别保存所有数据帧:

groups <- c("x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10")
X <- split(data5, f = groups)

像这样我只收到一个子集数据帧。

【问题讨论】:

  • 你试过data5$groupingVar而不是f = groups,其中groupingVar是包含值x1、x2等的列?
  • 我想按行而不是按列分割..
  • 您是否期望输出为 10 个长度相等并命名为 x1..x10 的数据帧?
  • 是的,这是预期的输出
  • 这不是 split 的作用。第二个参数是一个分组变量(任何可强制因子),它确定如何拆分数据。您可以创建一个重复序列为 1:10 的新变量,然后将该向量用作第二个参数。

标签: r dataframe split


【解决方案1】:

如果你想将大数据框任意拆分成小数据框,可以在数据框中添加一个均匀分布的分组变量,然后使用拆分。

df <- data.frame(group = rep(1:3, 4),
                 val = runif(12))

df

   group       val
1      1 0.5883321
2      2 0.5704967
3      3 0.7866597
4      1 0.8685778
5      2 0.6580090
6      3 0.1036386
7      1 0.7858867
8      2 0.2679281
9      3 0.2577965
10     1 0.6040585
11     2 0.6987716
12     3 0.2328914
> 

split(df, x$groupVal)

> $a
   group       val
2      2 0.5704967
5      2 0.6580090
8      2 0.2679281
11     2 0.6987716

$b
   group       val
1      1 0.5883321
4      1 0.8685778
7      1 0.7858867
10     1 0.6040585

$c
   group       val
3      3 0.7866597
6      3 0.1036386
9      3 0.2577965
12     3 0.2328914

【讨论】:

    【解决方案2】:

    如果你想split你的data并单独保存,我建议使用tidyverse的以下方法。

    拆分数据

    # libraries;
    library(tidyverse)
    library(data.table)
    
    # split data according to some
    # variable and store
    
    data_list <- mtcars %>% split(
            f = .$cyl
    ) %>% set_names(
            nm = paste("cylinder", names(.), sep = "")
    )
    

    这里,f = .$cyl 指的是您感兴趣的数据集中的分组变量。在这个例子中,我根据cylmtcars 中拆分数据。

    函数根据data 中的每个级别进行拆分。在本例中为 4、6 和 8 个气缸。

    我从purrr 继续使用set_names 来相应地命名列表中的每个元素。

    保存数据

    # store and save locally
    # by using map
    
    map(
            .x = 1:length(data_list),
            .f = function(i) {
                    
                    # set name of data to save locally
                    path <- paste(names(data_list[i]), ".csv", sep = "")
                    
                    # save with fwrite
                    fwrite(
                            data_list[[i]],
                            file = path,
                            sep  = ";"
                    )
                    
                    
            }
    )
    

    我使用map 遍历split 创建的列表的整个长度,并根据我们上面使用data.table 中的fwrite 设置的名称将它们保存在本地以获得更好的性能。

    请注意,在脚本中,每个数据都保存为paste(names(data_list[i]), ".csv", sep = ""),其计算结果为cylinder4.csvcylinder6.csvcylinder8.csv

    对您的数据使用相同的方法,只需对脚本进行少量更改即可。

    最好的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多