2014-11-14 44 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