【问题标题】:split data table to small tables R将数据表拆分为小表 R
【发布时间】:2015-04-05 15:49:46
【问题描述】:

我有一个下表(超过 1k 行):

  x1      x2  x3  x4 
7809  243638   1   1 
7809  243638   1   1
7809  243638   1   1 
... 
3453  222222   1   0

我需要根据第二列x2 将此表拆分为小表(在我的环境中作为数据框)。 我尝试过split(dat,dat$x2),R 做得对,但在列表中。

【问题讨论】:

  • 正如您自己所说的“R 做到了正确,但在 list 中”。 R 确实做得对,并将其保留为列表格式,因为用大量数据集污染您的全球环境是错误的。

标签: r split dataframe


【解决方案1】:

如果你这样做了

split_list <- split(dat,dat$x2)

您可以使用

访问拆分结果
split_list[[1]]
split_list[[2]]
....

转换结果

# to a data.frame
df1 <- as.data.frame(split_list[[1]])

# to a table
t1 <- as.table(split_list[[1]])

存储在多个数据集中(即使我看不到它的好处)

names1 <- names(split_list)

for(i in seq_along(names1)){
  assign(names1[i], split_list[[i]])
}

【讨论】:

【解决方案2】:

我知道这个问题有点老了。我最近遇到了类似的问题,仍然想分享代码。

我想将data.table 分成大小相等的块。我通过将data.table 的总行数除以我打算接收的较小data.tables 的数量预先计算出的块数。我编写了一个函数,将data.table(输入x)拆分为具有相同行数的块(no_rows_per_frame)并放置一个路径来存储帧(path_to_store)。

我需要它来手动收集块的变量。但是您可以将其重写为简单地分别返回所有data.tables。或者更好,根据@David Arenburg 的回答:将其存储在列表中,不要污染您的全球环境。注意:该代码使用循环可能效率不高,但对于包含近 500k 观察值的样本来说非常快(就像data.table 一样)。


# function: split into equally-sized samples for handcollection
split_data_table <- function(x, no_rows_per_frame, path_to_store){

  split_vec <- seq(1, nrow(x), no_rows_per_frame)

  for (split_cut in split_vec) {
    sample <- x[split_cut:(split_cut+(no_rows_per_frame-1))]
    fwrite(sample, paste(path_to_store, "sample_until_", (split_cut+(no_rows_per_frame-1)), ".csv", sep = ""))
  }
}

# apply sample cut
split_data_table(x = vendor_tab, no_rows_per_frame = 5000, 
                 path_to_store = "C/...")

希望对你有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2012-08-18
    相关资源
    最近更新 更多