将数据表拆分为小表R.

时间:2015-04-05 15:49:46

标签: r split dataframe

我有一张下表(超过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做得对,但在列表中。

2 个答案:

答案 0 :(得分: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]])
}

答案 1 :(得分:0)

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

我想将data.table分成相等大小的块。我预先通过将data.table的行总数除以我打算接收的较小data.table的数目而计算出的块数。我编写了一个函数,将x(输入no_rows_per_frame)分成行数相等的块(path_to_store),然后放置一条路径来存储帧({{1 }})。

我需要它来手动收集块的变量。但是您可以重写它以简单地分别返回所有data.table。或者更好,并根据@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/...")

希望对您有帮助。