【问题标题】:Deleting rows in dataset删除数据集中的行
【发布时间】:2013-05-23 23:38:04
【问题描述】:

我的面板数据集中有一些损坏的数据 - 对于某些组 (gid) 和时间 (t),我有不止一个观察结果。所有观察值都有变量(数量) - 我希望 R 排除数量最少的观察值。

我目前的解决方案是这样,但是我无法控制 R 将排除的两个相同观察中的哪一个...

IMS <- subset(IMS, !duplicated(data.frame(t,gid)))

例子:

Product    Strength    Pack_size    y        t    Quantity    gid
Ibumetin    600MG        100      5.9183     1      10226    2613
Ibumetin    600MG        100      25.3500    1        100    2613

在示例中,要排除的观察是数量为 100 的观察,因为 10226>100。

感谢您提供的帮助,

亨里克

【问题讨论】:

    标签: r


    【解决方案1】:

    使用非常有用的“plyr”包有一个非常简单的方法。

    设置:我需要一些试验数据来完成这项工作。这是我使用的:

    IMS <- read.table(text="
    Product    Strength    Pack_size    y        t    Quantity    gid
    Ibumetin    600MG        100      5.9183     1      10226    2613
    Ibumetin    600MG        100      25.3500    1        100    2613
    Simvastatin  30MG         90      14.1630    1       1036    2614
    Simvastatin  30MG         90      12.3345    1       2102    2614
    ", header=TRUE)
    

    第 1 步:找出每组 [gid]-[t] 对的 [Quantity] 最大值。

    library(plyr)
    temp_IMS <- ddply(IMS, .(gid,t), mutate, Quantity_max=max(Quantity))
    
    #       Product Strength Pack_size       y t Quantity  gid Quantity_max
    # 1    Ibumetin    600MG       100  5.9183 1    10226 2613        10226
    # 2    Ibumetin    600MG       100 25.3500 1      100 2613        10226
    # 3 Simvastatin     30MG        90 14.1630 1     1036 2614         2102
    # 4 Simvastatin     30MG        90 12.3345 1     2102 2614         2102
    

    我们在这里使用“ply”的“dd”变体,因为我们期望输入和输出的数据帧 (d-d-ply)。我们没有做任何特别的事情;我们只是添加了一个名为 [Quantity_max] 的新列,它是通过采用共享相同 [gid] 和 [t] 对 .(gid,t) 的 [Quantity] 值中的 max() 来计算的。 'mutate' 函数保留了数据帧的其余部分,让我们不必为了完成这项工作而做一些愚蠢的小动作。

    第 2 步:选择具有相同 [Quantity] 和 [Quantity_max] 的行。

    IMS_filtered <- IMS[temp_IMS$Quantity == temp_IMS$Quantity_max,]
    
    #       Product Strength Pack_size       y t Quantity  gid
    # 1    Ibumetin    600MG       100  5.9183 1    10226 2613
    # 4 Simvastatin     30MG        90 12.3345 1     2102 2614
    

    我们所做的是根据使用“plyr”创建的临时数据框过滤原始数据框。

    第 3 步(可选):如果多行可能具有相同的数量值,那么您需要找到某种方法来选择要使用的行。如果行完全相同,那么您有一个简单的解决方案:

    IMS_filtered <- unique(IMS_filtered)
    

    但是,如果您有不同的 [y] 值,则需要执行其他操作,例如基于重复匹配项进行过滤,同时仅考虑某些列。例如,如果我不在乎选择哪个值,只要 [gid] 和 [t] 对相同,那么我可以通过简单的搜索来搜索重复项,如下所示:

    IMS_filtered <- IMS_filtered[!duplicated(IMS_filtered[,c("gid","t")]),]
    

    这通过选择不重复的行来选择第一次出现的 [gid]-[t] 对。

    希望这有帮助。

    【讨论】:

    • 这个解决方案效果很好 - 非常感谢 :-)
    【解决方案2】:

    最简单的方法是重新排序数据,以便首先列出最大数量,然后使用您提供的方法:

    subset(IMS[order(-IMS$Quantity),],!duplicated(data.frame(t,gid)))
          Product Strength Pack_size       y t Quantity  gid
    1    Ibumetin    600MG       100  5.9183 1    10226 2613
    4 Simvastatin     30MG        90 12.3345 1     2102 2614
    

    【讨论】:

    • 从计算机科学的角度来看,这绝对是正确的方法。排序数据和应用任意方法(在 CPU 周期中)比使用反映问题逻辑的方法快得多。如果您立即理解上述@James 的回答,我绝对推荐 James 的解决方案,而不是我发布的逻辑镜像解决方案。
    【解决方案3】:

    您可以使用 unique(df) 返回唯一行

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 2019-10-25
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      相关资源
      最近更新 更多