我的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
答案 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)返回唯一行