Использование для цикла в R, чтобы удалить выбросы в различных ведрах
У меня в наборе данных примерно 114000 индивидуальных идентификаторов. Каждый отдельный идентификатор имеет комбинацию чисел из трех разных переменных, и каждому идентификатору соответствует значение в долларах. Есть приблизительно 4000 различных комбинаций чисел из трех переменных. Другими словами, 140 000 удостоверений личности (и их долларов) помещаются в одно из 4000 ведер.
То, что я хочу сделать, используя цикл for в R, это удалить 2% верхних идентификаторов (на основе ассоциативной суммы идентификаторов в долларах) из каждого из 4000 сегментов. Я не хочу снимать верхние 2% долларов с каждого ведра.
Строки в моем наборе данных следующие: ID (отдельный идентификатор), Event_ID, AL_ID, ACR_ID, ID_Dollars **Event_ID, AL_ID и ACR_ID - это "три переменные", на которые я ссылался выше.
Я не знаю, как ссылаться на правильный набор данных для этого вопроса, или я бы включил его в свой пост. Надеюсь, мои объяснения достаточно ясны, чтобы ответить на поставленный мной вопрос, если нет, то я прошу прощения.
Заранее спасибо за помощь, это очень ценится.
Обновлено 17.11.2014:
Теперь у меня есть следующий скрипт:
# 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))
Хотя сценарий является шагом в правильном направлении, он все еще не выполняет то, что я в конечном итоге хочу сделать с набором данных. Моя цель состоит в том, чтобы удалить верхние 2% из episode_ID (в долларах) из каждого из 4000 сегментов. Дайте мне знать, если я должен предоставить любую дополнительную информацию. Как всегда, спасибо за вашу помощь.
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.