【问题标题】:How to filter a column based on a condition from another column in R如何根据R中另一列的条件过滤列
【发布时间】:2017-02-23 11:09:57
【问题描述】:

我有一个包含数百万行和数十列的庞大数据表,因此性能对我来说是一个至关重要的问题。该数据描述了对内容站点的访问。我想计算每次访问的最早(即最小命中时间)命中的 ContentId。我所做的是: dt[,.(FirstContentOfVisit=ContentID[ContentID != ""][which.min(HitTime)]), by=VisitId,.SDcols=c("ContentID","HitTime")]

问题是我不知道是 which.min 首先计算所有 HitTime 向量上的最小值(我不想要!)还是只在过滤的 HitTime 向量上计算(对应于非空 ContentID)。

此外,在我计算之后 - 如何获得与第一个不同的 ContentID 的最小 HitTime(即非第一个内容 id 的最早命中时间)。

当我尝试使用用户定义的函数(首先 - 对子数据表进行排序,然后提取所需的值)进行这两种操作时,它花了很长时间(实际上从未停止过),尽管我有一台非常强大的机器(虚拟机)配备 180 GB 内存。所以我正在寻找内联解决方案。

【问题讨论】:

    标签: r vector subset


    【解决方案1】:

    dplyr 使这变得更容易。你没有分享你的数据样本,但我假设感兴趣的变量看起来像这样。

    web <- tibble(
      HitTime = sample(seq(as.Date('2010/01/01'), as.Date('2017/02/23'), by="day"), 1000),
      ContentID = 1:1000,
      SessionID = sample(1:100, 1000, replace = TRUE)
    )
    

    那么你可以只使用group_by和summarise为每个SessionID找到HitTime的最早值。

    web %>%
      group_by(SessionID) %>%
      summarise(HitTime = min(HitTime))
    

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2020-05-28
      • 2018-09-15
      • 1970-01-01
      • 2022-11-03
      • 2013-09-06
      • 2022-12-22
      • 1970-01-01
      相关资源
      最近更新 更多