Re: [问题] 读取csv中特定的row

楼主: celestialgod (天)   2016-03-09 10:42:33
# 全部读进来在切割就好了:
library(magrittr)
library(data.table)
library(dplyr)
cv_index_f <- function(numSampleSize, numFold){
cvIndex <- rep(1:numFold, each = floor(numSampleSize / numFold))
m <- numSampleSize %% numFold
if (m > 0)
cvIndex %<>% c(1:m)
return(cvIndex %>% sample(length(.)))
}
dat <- data.table(x = rnorm(100), y = rnorm(100))
cvDat <- dat %>% mutate(cvIndex = cv_index_f(nrow(.), 10)) %>%
split(.$cvIndex)
# > str(cvDat)
# List of 10
# $ 1 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.424 -0.181 0.241 0.31 0.874 ...
# ..$ y : num [1:10] 0.272 -1.197 -0.441 -0.499 -2.136 ...
# ..$ cvIndex: int [1:10] 1 1 1 1 1 1 1 1 1 1
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 2 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.533 1.25 -1.689 -1.557 -1.597 ...
# ..$ y : num [1:10] 0.266 1.272 0.876 2.442 0.928 ...
# ..$ cvIndex: int [1:10] 2 2 2 2 2 2 2 2 2 2
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 3 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] 0.437 0.463 2.512 0.919 -1.206 ...
# ..$ y : num [1:10] -1.3943 -1.7927 0.0471 0.9818 -1.0305 ...
# ..$ cvIndex: int [1:10] 3 3 3 3 3 3 3 3 3 3
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 4 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.361 -0.34 0.621 1.266 -0.356 ...
# ..$ y : num [1:10] -0.315 -0.51 -0.257 -1.533 -1.02 ...
# ..$ cvIndex: int [1:10] 4 4 4 4 4 4 4 4 4 4
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 5 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] 1.141 -1.699 -1.076 0.443 0.864 ...
# ..$ y : num [1:10] 0.3992 0.6175 -1.496 -0.7096 0.0923 ...
# ..$ cvIndex: int [1:10] 5 5 5 5 5 5 5 5 5 5
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 6 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.175 -0.785 -2.775 -0.315 0.375 ...
# ..$ y : num [1:10] -0.262 0.811 1.763 -1.197 0.712 ...
# ..$ cvIndex: int [1:10] 6 6 6 6 6 6 6 6 6 6
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 7 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] 1.2276 0.0944 0.9955 -1.0433 0.2058 ...
# ..$ y : num [1:10] -0.216 -0.691 -3.355 1.082 -1.641 ...
# ..$ cvIndex: int [1:10] 7 7 7 7 7 7 7 7 7 7
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 8 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.9693 -0.3944 -0.1652 -0.0932 -1.9734 ...
# ..$ y : num [1:10] -0.0336 1.1692 -0.2655 -1.9138 -1.3532 ...
# ..$ cvIndex: int [1:10] 8 8 8 8 8 8 8 8 8 8
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 9 :Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] -0.36 1.2 -1.17 2.5 1.16 ...
# ..$ y : num [1:10] 0.4338 -0.4115 0.2877 1.2177 -0.0426 ...
# ..$ cvIndex: int [1:10] 9 9 9 9 9 9 9 9 9 9
# ..- attr(*, ".internal.selfref")=<externalptr>
# $ 10:Classes ‘data.table’ and 'data.frame': 10 obs. of 3 variables:
# ..$ x : num [1:10] 1.583 -1.054 -0.362 -0.259 1.229 ...
# ..$ y : num [1:10] -0.135 0.481 -1.52 0.627 0.72 ...
# ..$ cvIndex: int [1:10] 10 10 10 10 10 10 10 10 10 10
# ..- attr(*, ".internal.selfref")=<externalptr>
# 你的case就长这样:
cvDat <- fread(fileName, sep=',') %>%
mutate(cvIndex = cv_index_f(nrow(.), 10)) %>%
split(.$cvIndex)
# 如果要移除cvIndex,可以直接这样做
cvDat %<>% lapply(function(x) select(x, -cvIndex))
# or equivalently
cvDat %<>% lapply(select, -cvIndex)
# or use purrr
library(purrr)
cvDat %<>% map(~select(., -cvIndex))
# or equivalently
cvDat %<>% map(select, -cvIndex)
题外话:
不建议你用内建函数的名称当做变量名称,ex: seq, file, nrow, c等
※ 引述《MADNUG (就是比你长)》之铭言:
: [问题类型]:
: 效能咨询(我想让R 跑更快)
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 小弟有个3.8G多的csv档,但只想要随机读取1/10的row
: fread好像没read specific rows的指令,
: 难道只能读整个档案再select row了吗?
: 这样好没效率呀.....
: 若要cross-validation的话光I/O就跑死了....
: 想请问有没有更效率一点方法呢?
: 谢谢了
: [程式范例]:
: 参考网络用fread + nrow and skip 写了一下,但是更慢Orz.....
: 但也是预料中啦XDD
: http://pastebin.com/gW9W1GmN
: [关键字]:
:
: fread
:
作者: MADNUG (1234567654321一下吧)   2016-03-09 11:53:00
谢谢!但资料量大的话,这样就有内存不足的问题了吧?会不想整个读进去,其中一个考量也是内存Orz因为读资料后,内存已经剩不多,再C-V的话就爆了内存问题真是棘手囧...我来研究ff试试,谢谢了!

Links booklink

Contact Us: admin [ a t ] ucptt.com