具有大数据框(近100m行) 想要通过因素来子集数据帧,即 将前100个因数的完整数据合并到一个数据帧中,再将100个因数完整 或(甚至我不确定下面的那个) 因子(类别)从字母A:J一批开始,L:R作为另一种数据帧开始
(实际上,在处理大数据帧时我遇到内存问题,简单的行拆分不能解决工作上的问题)
任何建议表示赞赏。谢谢
Sample data set
ID FACTORS VALUE
1 ABCD 100
2 ABCD 101
3 ABCD 102
4 ABCD 103
5 ABCD 104
6 DEFG 105
7 DEFG 106
8 DEFG 107
9 DEFG 108
10 DEFG 109
11 DEFG 110
12 HIJK 111
13 HIJK 112
14 HIJK 113
15 HIJK 114
16 HIJK 115
17 HIJK 116
18 MNOP 117
19 MNOP 118
20 MNOP 119
21 MNOP 120
22 MNOP 121
23 99-1 122
24 99-1 123
25 99-1 124
26 99-2 125
27 99-2 126
答案 0 :(得分:1)
这与Split a vector into chunks in R
松散相关首先,让我们获取唯一因素并将其分成大小为n
的垃圾箱:
fctrs <- unique(dat$FACTORS)
fctrs
# [1] "ABCD" "DEFG" "HIJK" "MNOP" "99-1" "99-2"
n <- 3 # set to 100 for your data
fctrgroups <- split(fctrs, ceiling(seq_along(fctrs)/n))
str(fctrgroups)
# List of 2
# $ 1: chr [1:3] "ABCD" "DEFG" "HIJK"
# $ 2: chr [1:3] "MNOP" "99-1" "99-2"
(最后一组可能少于n
。)
有两种方法可以解决此问题。如果您要将其全部保留在内存中,但一次只处理一个子集,那么我建议您将分隔的帧保留在list
中,然后在另一个lapply
中进行工作:
lst_o_frames <- lapply(fctrgroups, function(f) subset(dat, FACTORS %in% f))
str(lst_o_frames)
# List of 2
# $ 1:'data.frame': 17 obs. of 3 variables:
# ..$ ID : int [1:17] 1 2 3 4 5 6 7 8 9 10 ...
# ..$ FACTORS: chr [1:17] "ABCD" "ABCD" "ABCD" "ABCD" ...
# ..$ VALUE : int [1:17] 100 101 102 103 104 105 106 107 108 109 ...
# $ 2:'data.frame': 10 obs. of 3 variables:
# ..$ ID : int [1:10] 18 19 20 21 22 23 24 25 26 27
# ..$ FACTORS: chr [1:10] "MNOP" "MNOP" "MNOP" "MNOP" ...
# ..$ VALUE : int [1:10] 117 118 119 120 121 122 123 124 125 126
如果您将工作投入到名为myfunc
的用户函数中,则可以做到
processed_lst_o_frames <- lapply(lst_o_frames, myfunc)
但是,如果您只想将数据保存到CSV(或类似文件)中,以便可以在其他地方使用它们,那么类似的事情将起作用:
for (f in fctrgroups) {
write.csv(subset(dat, FACTORS %in% f), paste0(f[[1]][1], ".csv"))
}
请注意,该方法也经常用于子帧的实际工作。这样做当然是可行的,但是却错过了R的优势和“对列表的每个elem
做一些功能” 的简化编程步骤。