【问题标题】:Efficient Way to Incrementally Count Unique Data Points in Data Frame增量计算数据框中唯一数据点的有效方法
【发布时间】:2023-04-06 22:22:01
【问题描述】:

我正在尝试找到一种更有效的方法来增量计算数据框中的唯一数据点。

例如,我写了以下代码:

df = matrix(c(1,2,3,3,4,5,1,2,4,4))

count = matrix(nrow = nrow(df),ncol=1)

for (i in 1:nrow(df)) {

  count[i,1] = length(which(df[1:i,1] == df[i,1]))

}

代码的目的是递增地计算特定值的每个实例,例如count 列将具有以下结果:

1,1,1,2,1,1,2,2,2,3.

到目前为止我编写的代码可以完成这项工作,但是上面的示例 df 仅包含 10 个值。我尝试执行此功能的真实数据帧包含52,118 values,这需要大量时间。

有谁知道执行上述代码的更有效方法?

【问题讨论】:

    标签: r count dataframe


    【解决方案1】:

    data.table 解决方案

    library(data.table)
    set.seed(20)
    dat  <-data.frame(values = sample(1:3, 50000, replace=TRUE))
    setDT(dat)[,runningCount:=1:.N,values]
    
           values runningCount
        1:      3            1
        2:      3            2
        3:      1            1
        4:      2            1
        5:      3            3
       ---                    
    49996:      1        16674
    49997:      2        16516
    49998:      2        16517
    49999:      2        16518
    50000:      2        16519
    

    【讨论】:

    • 感谢大家的所有反馈!我正在尝试实现“data.table”和“dplyr”方法,因为它们对我来说最有意义。话虽这么说,但在使用“data.table”方法时,我不断收到错误消息,说“setDT”函数未找到。这是为什么呢?
    • 您使用的是哪个版本的 data.table?见这里:stackoverflow.com/questions/20345022/…。此外,“setDT”的参数“x”应该是“list”、“data.frame”或“data.table”
    • 我的数据集是一个data.frame,所以没关系。我拥有的 data.table 版本是 1.9.4。我刚刚在 20 分钟前下载了它。
    • 确切的错误是什么? data.table::setDT(dat)[,runningCount:=1:.N,values] 有帮助吗? (这种情况下不加载data.table包)
    • 我刚刚修好了。我只运行了一部分代码,所以它无法引用其他数据集。非常感谢你的帮助!如果你不介意,你能解释一下“setDT”是做什么的吗?而且,“runningCount”是 data.table 包中的一个函数吗?我一直在寻找解决方案,但从未遇到 runningcount。
    【解决方案2】:

    一个基地R 方法:

    Reduce(`+`,lapply(unique(c(df)), function(u){b=c(df)==u;b[b==T]=cumsum(b[b==T]);b}))
    #[1] 1 1 1 2 1 1 2 2 2 3
    

    【讨论】:

      【解决方案3】:

      这是dplyr 包的快速方法:

      library(dplyr)
      
      # Fake data
      set.seed(20)
      dat  = data.frame(values = sample(1:3, 50000, replace=TRUE))
      
      dat %>% group_by(values) %>%
        mutate(runningCount = 1:n())
      
         values runningCount
      1       2            1
      2       3            1
      3       1            1
      4       3            2
      5       1            2
      6       3            3
      7       3            4
      ..    ...          ...
      

      时间(以毫秒为单位):

           min       lq     mean   median       uq      max  neval
      2.003755 2.134762 2.198161 2.186214 2.231662 3.665328    100
      

      到目前为止所有答案的时间安排(使用我创建的数据):

                      median
              dplyr:   2.11
         data.table:   1.24
      lapply/Reduce:  11.61
                ave:   9.93
      

      所以data.table 是最快的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多