【问题标题】:Efficient way to de-duplicate a dataframe in R and create case weights在 R 中对数据框进行重复数据删除并创建案例权重的有效方法
【发布时间】:2022-08-10 23:45:35
【问题描述】:

问题

我有一个非常大的数据框,其中包含约 60 列和约 12M 行,我想为训练模型做准备。

为了加快整个过程,我喜欢通过仅获取唯一行及其案例权重(它们出现的频率)来折叠数据框。

所以从这个数据框开始:

V1 | V2 | V3
------------
A  | B  | A
A  | B  | A
C  | C  | A
C  | C  | A
C  | C  | A

到这个数据框:

V1 | V2 | V3 | weights
----------------------
A  | B  | A  | 2
C  | C  | A  | 3

当前方法

目前我使用dplyr 逻辑来做到这一点,它有效但也需要永远:

library(dplyr)
df %>% group_by_all() %>% count()

有没有更好的,尤其是计算速度更快的方法?也许甚至在阅读csv而不是之后这样做?

  • 如果您使用可执行代码构建示例 df(例如,在您最后手动构建它,并使用 dput() 输出代码以重现它,那么人们会更容易帮助您。或者只是向我们展示手册的代码建造。)

标签: r dataframe aggregate


【解决方案1】:

考虑到硬件,也许你的数据太大了,但你试过data.table吗?

library(data.table)
setDTthreads(0L)
setDT(df)[, .N, by = names(df)]

#        V1     V2     V3     N
#    <char> <char> <char> <int>
# 1:      A      B      A     2
# 2:      C      C      A     3

可重现数据:

df = data.frame(
  V1 = c("A", "A", "C", "C", "C"), 
  V2 = c("B", "B", "C", "C", "C"), 
  V3 = c("A", "A", "A", "A", "A")
)

【讨论】:

  • 我在 GCP 笔记本上这样做,所以我有一个舒适的 40vCPU 和 961 GB RAM 可用。我正在执行代码并测量时间,感谢您的提示!
  • 这个解决方案只用了 6 分钟,所以我把它算作胜利者。
【解决方案2】:

使用aggregate 的基本 R 选项

> aggregate(n ~ ., cbind(df, n = 1), sum)
  V1 V2 V3 n
1  A  B  A 2
2  C  C  A 3

【讨论】:

    【解决方案3】:

    dplyr

    library(dplyr)
    df %>% 
      count(across(everything()))
      V1 V2 V3 n
    1  A  B  A 2
    2  C  C  A 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多