【问题标题】:How to subset a large data frame (ffdf) in R by date?如何按日期对 R 中的大数据框(ffdf)进行子集化?
【发布时间】:2013-10-25 23:23:49
【问题描述】:

我正在尝试按日期对 FFDF 进行子集化。下面,我已经使用普通数据框成功创建了这样一个子集。但是我需要一些帮助才能将其应用于 FFDF。我的尝试以及错误消息都列在代码注释中。非常感谢!

#Create a normal data frame (in production this is read directly into an ffdf 
#through a csv file)

start  <- c("01/01/2010", "01/01/2011", "01/01/2012", "01/01/2012", "01/01/2012")
end  <- c("31/12/2010", "31/12/2011", "31/12/2012", "31/12/2012", "31/12/2012")
amount <- c(10,20,30,40,50)
df <- data.frame(start,end,amount)

#Ensure subsetting works on a normal data frame

  #convert type to proper date (this has to be done in production after csv file
  #has been read in)
  df$start <- as.Date(df$start, format="%d/%m/%Y")
  df$end <- as.Date(df$end, format="%d/%m/%Y")

  #Subset
  df <- subset(df, start == as.Date("2012-01-01",format="%Y-%m-%d"))

  #Works :) Now let's try with ffdf

ffdf <- as.ffdf(df)

  #Type conversion for dates (again, applied in production after mammoth csv has
  #been read in)
  ffdf$start <- as.Date(ffdf$start, format="%m/%d/%Y")
  ffdf$end <- as.Date(ffdf$end, format="%m/%d/%Y")

  #Subset
  ffdf <- subset.ff(ffdf, start==as.Date("2012-01-01",format="%Y-%m-%d"))
  #ERROR: Error in ffdf(x = x) : ffdf components must be atomic ff objects

【问题讨论】:

    标签: r ffbase ff


    【解决方案1】:

    使用 ffbase 包中的 subset.ffdf。 Subset 是 R 中的一个通用函数,ffbase 为 ffdf 对象实现了它。因此,您可以像使用常规数据框一样使用子集。

    df <- data.frame(start=c("01/01/2010", "01/01/2011", "01/01/2012", "01/01/2012", "01/01/2012"),end=c("31/12/2010", "31/12/2011", "31/12/2012", "31/12/2012", "31/12/2012"),amount=c(10,20,30,40,50))
    df$start <- as.Date(df$start, "%d/%m/%Y")
    df$end<- as.Date(df$end, "%d/%m/%Y")
    
    require(ffbase)
    myffdf <- as.ffdf(df)
    test <- subset(myffdf , start==as.Date("2012-01-01",format="%Y-%m-%d"))
    test
    

    【讨论】:

    • 非常感谢。我刚刚尝试运行您的代码,但它返回以下错误: UseMethod("as.hi") 中的错误:没有适用于“as.hi”的方法应用于“NULL”类的对象。我不知道如何修复这么简单的一段代码。不过,它看起来确实很有希望。再次感谢您。
    • 感谢示例,它揭示了subset.ffdf 中的一个小问题,该问题现已在ffbase 的开发版本中得到修复。您可以通过库(devtools)安装它; install_github("ffbase", "edwindj", subdir="pkg");这将解决您的问题。
    • 谢谢埃德温。该修复已奏效。它需要按照上面的说明从 Github 安装固定版本的 ffbase 包。我还必须将我的 R 版本升级到最新版本,因为我的旧版本 R 无法使用 devtools。此外,devtools 依赖于 libcurl,它不会自动安装,所以我也必须使用在主 Ubuntu 终端(不是 R 控制台)中的命令“sudo apt-get install libcurl4-openssl-dev”。
    猜你喜欢
    • 2020-10-17
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2021-02-01
    相关资源
    最近更新 更多