【问题标题】:How to collapse very large sparse dataframes如何折叠非常大的稀疏数据框
【发布时间】:2014-03-25 12:35:12
【问题描述】:

我想在一个数据帧的 1500 个稀疏行上总结大约 10000 个列,例如 colSparseX。如果我有输入:

(我在 OriginalDataframe 上试过这个:

coldatfra <- aggregate(. ~colID,datfra,sum)

还有这个:

coldatfra <- ddply(datfra, .(colID), numcolwise(sum))

但它不起作用!)

colID <- c(rep(seq(1:6),2), rep(seq(1:2),3))
colSparse1 <- c(rep(1,5), rep(0,4), rep(1,2), rep(0,5), rep(1,2))
cPlSpars2 <- c(rep(1,3), rep(0,6), rep(1,2), rep(0,5), rep(1,2))
coMSparse3 <- c(rep(1,6), rep(0,3), rep(1,2), rep(0,5), rep(1,2))
colSpArseN <- c(rep(1,2), rep(0,7), rep(1,2), rep(0,5), rep(1,2))

(datfra <- data.frame(colID, colSparse1, cPlSpars2, coMSparse3, colSpArseN))

colID colSparse1 cPlSpars2 coMSparse3 colSpArseN
    1          1         1          1          1
    2          1         1          1          1
    3          1         1          1          0
    4          1         0          1          0
    5          1         0          1          0
    6          0         0          1          0
    1          0         0          0          0
    2          0         0          0          0
    3          0         0          0          0
    4          1         1          1          1
    5          1         1          1          1
    6          0         0          0          0
    1          0         0          0          0
    2          0         0          0          0
    1          0         0          0          0
    2          0         0          0          0
    1          1         1          1          1
    2          1         1          1          1

并且想要对所有的每个 ID 的元素求和(10000 列 - 需要一些占位符来表示 colnames 是非常可变的词)colSparses 才能得到这个:

colID colSparse1 cPlSpars2 coMSparse3 colSpArseN
    1          2         2          2          2
    2          2         2          2          2
    3          1         1          1          0
    4          2         1          2          1
    5          2         1          2          1
    6          0         0          1          0

注意:str(OriginalDataframe)

'data.frame':   1500 obs. of  10000 variables:
 $ someword                                                : num  0 0 0 0 0 0 0 0 0 0 ...
 $ anotherword                                             : num  0 0 0 0 0 0 0 0 0 0 ...

在使用 ddply(datfra, .(colID), numcolwise(sum)) 处理的 OriginalDataframe 的较小版本(已终止)上,我得到:

     colID colSparse1 cPlSpars2 coMSparse3 colSpArseN
1     0019          0         0          0          0
NA    <NA>         NA        NA         NA         NA
NA.1  <NA>         NA        NA         NA         NA
NA.2  <NA>         NA        NA         NA         NA
NA.3  <NA>         NA        NA         NA         NA

【问题讨论】:

  • 我没有收到这些错误
  • @rawr 你好,再次 :) 非常感谢!我稍微扩展了这个例子,也许你现在得到了错误。但是,该问题可能与ddply 有关(它可能不会那么有效地工作)。是否可以避免ddply
  • 我复制了你所有的代码,它运行良好。清除您的工作区并再次运行它。另外,plyr 用于数据帧,数据帧不是矩阵。有一些包有处理稀疏矩阵的方法,我认为MatrixSparseM。我不使用它们,所以我无法为您指出相关的功能。
  • @rawr 非常感谢!我需要对数据框进行操作(更改标题)。但是idea很好。我将在矩阵上尝试一种解决方法!
  • ddply 不是您想要有效地使用data.frames 的解决方案。请查看dplyrdata.table

标签: r plyr sparse-matrix


【解决方案1】:

看看我对这个问题的回答: Mean per group in a data.frame

你的问题很相似。如果您将所应用的函数从均值更改为求和,您就会得到所需的结果。

colstosum <- names(mydt)[2:5]
mydt.sum <- mydt[,lapply(.SD,sum,na.rm=TRUE),by=colID,.SDcols=colstosum]

mydt.sum
   colID colSparse1 cPlSpars2 coMSparse3 colSpArseN
1:     1          2         2          2          2
2:     2          2         2          2          2
3:     3          1         1          1          0
4:     4          2         1          2          1
5:     5          2         1          2          1
6:     6          0         0          1          0

当然,我不能保证 sum 在大型 data.table 上的速度或缺乏速度。此外,还有一种方法应该能够将 colSums 合并到 lapply 函数中,但我目前无法弄清楚语法。

【讨论】:

  • 非常感谢您的回答。在我的系统上它不起作用。在第二次尝试中,我还加载了library(data.table),但没有任何改变。对于colstosum &lt;- names(mydt[,2:5,with=F]),我得到Error in '[.data.frame'(mydt, , 2:5, with = F) : unused argument (with = F),对于第二行,我得到:Error in '[.data.frame'(mydt, , lapply(.SD, sum, na.rm = TRUE), by = colID, : unused arguments (by = colID, .SDcols = colstosum)
  • 听起来您在尝试对其运行 data.table 命令之前没有将 mydt 转换为 data.table。先做mydt &lt;- data.table(mydt)
猜你喜欢
  • 2018-08-11
  • 2018-05-12
  • 2021-11-16
  • 1970-01-01
  • 2011-03-11
  • 2016-11-22
  • 2015-07-30
  • 2012-05-29
  • 2017-09-06
相关资源
最近更新 更多