我有一张下表(超过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做得对,但在列表中。
答案 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/...")
希望对您有帮助。