2014-11-14 43 views
0

我在我的数据集中有大约114,000个人ID。每个个人身份证都有来自三个不同变量的数字组合,每个ID都有一个与之相关的美元值。这三个变量有大约4,000个不同的数字组合。换句话说,140,000个ID(和他们的美元)被放入4000个桶中的一个中。在R中使用for循环删除各个桶中的异常值

我想在R中使用'for循环'来实现的目标是从4000个桶中删除最高2%的ID(基于ID的联想金额)。我不想从每个存储桶中删除前2%的美元。是

在我的数据集的行如下: ID(不同ID),EVENT_ID,AL_ID,ACR_ID,ID_Dollars ** EVENT_ID,AL_ID,和ACR_ID是 '三个变量' 我上面引用。

我不知道如何引用这个问题的适当的数据集,或者我将它包括在我的文章中。希望我的解释清楚地回答我提出的问题,如果不是的话,我很抱歉。

在此先感谢您的帮助,非常感谢。

更新2014年11月17日:

我现在有以下脚本:

# create random data similar to your requirements 
ID <- seq(1,114000) 
Event_ID <- sample(1:40, 114000,replace=TRUE) 
AL_ID <- sample(1:10, 114000,replace=TRUE) 
ACR_ID <- sample(1:10, 114000,replace=TRUE) 
ID_Dollars <- sample(1:200000,114000,replace=TRUE) 
df <- data.frame(ID,Event_ID,AL_ID,ACR_ID,ID_Dollars) 

# create buckets 
groupDf <- group_by(df,Event_ID,AL_ID,ACR_ID) 
groupDfSum <- summarize(groupDf, ID_Dollars=sum(as.numeric(ID_Dollars)) 
groupDfSumHowManyIDShouldBeCut <- mutate(groupDfSum,numberToCut = ceiling(ID_Dollars*0.02)) 

# Here I am using 1 but you should use maximum value of numberToCut. 
IDs_ToBeCut<-filter(groupDf, rank(ID_Dollars, ties.method="first")==max(groupDfSumHowManyIDShouldBeCut$numberToCut)) 

虽然剧本是朝着正确方向迈出的一步,但它仍然没有完成我最终要处理数据集。我的目标是从4000个桶中的每一个桶中移除episode_ID的前2%(基于美元)。让我知道是否应该提供任何其他信息。一如既往,感谢您的帮助。

+0

从数据集中给出一些示例行 – 2014-11-14 22:10:09

+0

@AtillaOzgur我包含了我的数据集中的行。需要帮助请叫我。谢谢。 – YimYames 2014-11-14 22:33:05

回答

1

我用dplyr写下面的解决方案,因为我理解你的问题。我可能错了,随时发表评论。

library(dplyr) 

# create random data similar to your requirements 
ID <- seq(1,114000) 
Event_ID <- sample(1:40, 114000,replace=TRUE) 
AL_ID <- sample(1:10, 114000,replace=TRUE) 
ACR_ID <- sample(1:10, 114000,replace=TRUE) 
ID_Dollars <- sample(1:200000,114000,replace=TRUE) 
df <- data.frame(ID,Event_ID,AL_ID,ACR_ID,ID_Dollars) 

# create buckets 
groupDf <- group_by(df,Event_ID,AL_ID,ACR_ID) 
groupDfSum <- summarize(groupDf,CountOfGroup=n()) 
groupDfSumHowManyIDShouldBeCut <- mutate(groupDfSum,numberToCut = ceiling(CountOfGroup*0.02)) 

# Here I am using 1 but you should use maximum value of numberToCut. 
IDs_ToBeCut<-filter(groupDf, rank(ID_Dollars, ties.method="first")==1) 


# After finding suitable ID values. You should for loop IDs_ToBeCut, control if that ID is lesser than numberToCut, and remove that ID value from df. 
+0

非常感谢您的帮助,我很感激。我对R还是比较陌生的,所以我对我的问题表示歉意。我试图确定您的脚本是否按照我希望的方式运行,但我无法弄清楚如何完整地查看数据。我想评估哪些ID将被删除,哪些将从每个存储桶中停留。有什么建议么? – YimYames 2014-11-15 14:02:49

+0

你在使用RStudio吗?尝试使用它的视图能力 – 2014-11-15 14:15:18

+0

基于我对我的qyestion所做的更新,你认为你可以修改你的脚本吗?让我知道你是否需要任何附加信息。谢谢。你一直很有帮助。 – YimYames 2014-11-19 14:08:02