用前100个因子对大数据帧进行子集

时间:2018-08-04 22:11:17

标签: r

具有大数据框(近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

1 个答案:

答案 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做一些功能” 的简化编程步骤。

相关问题