Использование для цикла в 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.
Другие вопросы по тегам