删除数据集中的行

时间:2013-05-23 11:26:39

标签: r

我的Panel数据集中有一些损坏的数据 - 对于某些组(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。

我将非常感谢您提供的帮助,

的Henrik

3 个答案:

答案 0 :(得分:3)

使用非常有用的“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]对的[数量]最大值。

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]对max()的[Quantity]值的.(gid,t)来计算。 'mutate'函数保留了数据框的其余部分,使我们不必做一个愚蠢的小舞蹈来完成这项工作。

第2步:选择具有相同[数量]和[数量_最大]的行。

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]对,通过说选择不重复的行。

希望这有用。

答案 1 :(得分: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

答案 2 :(得分:1)

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