【问题标题】:Filtering data in R (complex)在 R 中过滤数据(复杂)
【发布时间】:2013-05-09 00:38:57
【问题描述】:

我有一个包含 700 万条记录的数据集。

我需要过滤数据以仅显示其中大约 9000 个。

第一个字段 dmg 实际上是主键,格式为 1-Apr-123456。每个 dmg 值大约出现 12 次。

另一列是 O_Y,取值 0 或 1。最常见的是 0,但大约 900 次为 1。

我想返回具有相同 dmg 值的所有行,其中至少有一条记录具有且 O_Y 值为 1。

【问题讨论】:

  • 你能将数据读入 R (RAM) 吗?如果没有,包sqldf 可以完成任务。
  • Read this 学习如何提出好问题
  • 喜欢这个?假设0_Y 是第 j 列。 foo<-readLines(datafile,n=1); if foo[j]==1 my.data<-rbind(my.data,foo) ,然后循环记录尽可能多的记录。
  • Roman,谢谢 - 是的,它可以在 R 中正常读取。需要几分钟,但没关系。
  • 谢谢,Carl,我会试一试,然后告诉你我的进展情况。

标签: r dataset filtering


【解决方案1】:

我建议使用data.table 执行此操作(data.table 中的fread 在读取大型数据集时也非常方便,因为您说您有足够的 RAM)。

我不确定以下是在 data.table 中执行此操作的最佳方法,但至少它应该可以帮助您入门。希望其他人会出现并为此列出最惯用的 data.table 方式。但这是我现在能想到的:

假设您的 data.table 名为 DT 并且有两列 dmgO_Y。使用O_Y 作为DT 的索引键和O_Y == 1 的子集DT(data.table 语法中的DT[.(1)])。现在找到对应的dmg 值。这些dmg 值中的unique 是您的keys.with.ones。所有这些都简洁地完成如下:

setkey(DT, O_Y)
keys.with.ones <- unique(DT[.(1), dmg][["dmg"]])

接下来,我们需要提取与dmg 的这些值对应的行。为此,我们需要将DT 的键更改为dmg,并提取与上述键对应的行:

setkey(DT, dmg)
DT.filtered <- DT[.(keys.with.ones)]

我们完成了。 :)

如果可能,请参考 ?data.table 找出更好的方法并告诉我们。

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多