【问题标题】:How can I 'Split' my data set in R?如何在 R 中“拆分”我的数据集?
【发布时间】:2014-12-08 17:28:04
【问题描述】:

我已经尝试了很长一段时间来拆分我的测试数据。

> FDF <- read.csv.ffdf(file='C:\\Users\\William\\Desktop\\R Data\\TestData0812.txt', header = FALSE, colClasses=c('factor','factor','numeric','numeric','numeric','numeric'), sep=',')
> names(FDF)<- c('Date','Time','Open','High','Low','Close')
> 
> # ID
> FDF2 <-FDF[1:100,]
> FDF2 <- as.ffdf(FDF2)
> a <- nrow(FDF2)
> # Take section of import for testing
> FDF2[1:3,]
        Date  Time   Open   High    Low  Close
1 1987.08.28 12:00 1.6238 1.6240 1.6237 1.6239
2 1987.08.28 12:01 1.6239 1.6240 1.6235 1.6236
3 1987.08.28 12:02 1.6236 1.6239 1.6235 1.6238
> 
> ID <- data.frame(matrix(1:a, nrow = a, ncol=1 ))
> ID <- as.ffdf(ID)
> names(ID) <- c('ID')
> FDF3 <- cbind.ffdf2(ID, FDF2)
> # Create ID column and binds together
> FDF3[1:3,]
  ID       Date  Time   Open   High    Low  Close
1  1 1987.08.28 12:00 1.6238 1.6240 1.6237 1.6239
2  2 1987.08.28 12:01 1.6239 1.6240 1.6235 1.6236
3  3 1987.08.28 12:02 1.6236 1.6239 1.6235 1.6238

我将使用它的文件是一个 ffdf 对象,因为它是 700mb。我想知道如何拆分数据集?

我当前的代码是;

T = ffdfdply(FDF3, split(FDF3$ID, rep(1:10,each=10)))

我在论坛和其他网站上做了很多变化和研究。但是,为简单起见,我只包含了上面的示例。

操作上面的代码给我以下错误;

错误在 ffdfdply(FDF3, split(FDF3$ID, rep(1:10, each = 10))) :
split 需要与 x 中的行数长度相同

我似乎无法理解为什么 rep(1:10, each = 10) 的拆分在 > dim(FDF3) [1] 100 7 的数据集中不起作用

即使每个拆分也没有完整的行数,我也希望执行拆分,比如说:T = ffdfdply(FDF3, split(FDF3$ID, rep(1:10,each=3)))

我已经在这方面工作了至少 20 个小时。

【问题讨论】:

  • split(...) 的第一个参数必须是一个数据框,您传递的是一个向量 (FDF3$ID)。向量中的“行数”(例如,nrows(FDF3$ID))是NULL。试试split(FDF3,rep(1:10,each=10))
  • @jlhoward - 谢谢你的回复。我已经试过了。但是,我又试了一下; T = ffdfdply(FDF3, split(FDF3, rep(1:10,each=10))) 并收到 Error in ffdfdply(FDF3, split(FDF3, rep(1:10, each = 10))) : split needs to be the same length as the number of rows in x In addition: Warning message: In split.default(FDF3, rep(1:10, each = 10)) : data length is not a multiple of split variable 有什么想法吗?
  • 您期望T 究竟是什么? ffdf 对象的列表?数据框列表? ffdfdply(...) 是一个“split-apply-combine”函数,因此它需要一个 FUN=... 参数(请参阅文档)。
  • @jlhoward - 我曾期望 T(test) 是单独的 ffdf 对象,可通过类似于 split 函数的方式访问;对于 ffdf 1 = T$'1', 2 = T$'2' 等等,等等。我阅读了文档,但从未意识到这 3 个操作相互依赖,即如果没有 apply 或 combine 参数,您将无法使用 split。我假设这个是正确的吗?我认为创建子集循环可能更有效,如果是这样的话?您对我的方法是否适合我的任务有任何想法吗?再次感谢。

标签: r split ff


【解决方案1】:

我无法弄清楚 ffdfdplyr 包的正确用法,我仍然不知道它是否正确使用。但是,我已经构建了一个解决方法,希望有人觉得它有用。我要补充一点,它确实很难看,因此我愿意就如何简单地提出建议,并感谢您的 cmets。

ffdfEnd <- 5 
# Variable
ffdfrows = nrow(FDF3)
ffdfStart <- 1 
ffdfLoop <- ffdfStart 
ffdfSplitSize <- ffdfEnd
# Creates constants and varaibles

splitNum <- ffdfrows/ffdfEnd
# Calculates the number of split required
ffdf.names <- paste('FFDF', ffdfSplitSize, ffdfLoop:splitNum,sep='.')
# Creates names to be pasted to resulting tables

for (i in ffdfLoop:splitNum) {
        assign(ffdf.names[i], as.ffdf(FDF3[ffdfStart:ffdfEnd,]))
        ffdfStart = (ffdfEnd)
        ffdfEnd = (ffdfEnd + ffdfSplitSize)}
# loops over until requirments are fulfilled`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2021-04-24
    • 2015-08-12
    • 2015-08-28
    相关资源
    最近更新 更多