2010-07-23 2 views
1

Я пытаюсь итеративно сортировать данные в столбцах, чтобы извлечь N максимальных значений.R - Максимальные значения сортировки и подстановки в столбцах

Мои данные настроены с первым и вторым столбцами, содержащими заголовки и коды занятости, и все остальные столбцы, содержащие сравнительные значения (в данном случае данные о местоположении, которые должны были быть предварительно рассчитаны для каждого города) для тех занятия для разных городов:

*occ_code city1 ... city300* 
    occ1  5  ... 7 
    occ2  20  ... 22 
    .   .  .  . 
    .   .  .  . 
    occ800 20  ... 25 

для каждого города я хочу сортировать по максимальным значениям, выберите подмножество этих максимальных значений соответствующих их соответствующих профессий названий и названий. Я думал, что это будет относительно тривиально, но ...

Редактировать для уточнения: Я хочу закончить с отсортированным подмножеством данных для анализа.

 occ_code city1 
    occ200  10 
    occ90  8 
    occ20  2 
    occ95  1.5 

В то же время я хочу, чтобы иметь возможность повторить сортировку по столбцам (так я пробовал много порядка команды через вызов столбцов непосредственно: данные [2], просто чтобы быть в состоянии работать один и та же функция анализа за весь набор данных.

Я баловаться с plyr в течение последних 3-х дней, и я чувствую, как настройки моего набора данных просто не способствует тому, как должен был Plyer быть использован.

+1

Не могли бы вы немного разъяснить вопрос? Это поможет нам привести пример с меньшим фреймом данных в качестве входных данных и примером вывода, который вы хотите извлечь. – chrisamiller

+0

Да, сложно понять, что вы хотите здесь. – John

+0

Сначала я хочу получить подмножество с двумя столбцами данных: список из 10 самых больших значений столбца «city1», соответствующий их соответствующим «оксовым кодам» (из первого столбца). Это было бы достаточно просто, чтобы сказать excel, только мне нужно будет повторить операцию 300 раз * 10 лет данных. – AzadA

ответ

0

Я не совсем уверен, что ваш желаемый результат в соответствии с вашим примером Snippit. Вот как вы можете получить кадр данных, как, что для каждого города, используя plyr и reshape

#using the same df from nico's answer 
library(reshape) 
df.m <- melt(df, id = 1) 
a.cities <- cast(df.m, codes ~ . | variable) 

library(plyr) 
a.cities.max <- aaply(a.cities, 1, function(x) arrange(x, desc(`(all)`))[1:4,]) 

Теперь a.cities.max представляет собой массив кадров данных, с 4-х наибольшими значениями для каждого города в каждом кадре данных. Для того, чтобы получить один из этих кадров данных, вы можете индексировать его с

a.cities.max$X13 

Я не знаю точно, что вы будете делать с этими данными, но вы можете захотеть его обратно в формат кадра данных.

df.cities.max <- adply(a.cities.max, 1) 
+0

Я думаю, что все! – AzadA

0

Одним из способов было бы использовать order с ddply из пакета plyr

> library(plyr) 
> d<-data.frame(occu=rep(letters[1:5],2),city=rep(c('A','B'),each=5),val=1:10) 
> ddply(d,.(city),function(x) x[order(x$val,decreasing=TRUE)[1:3],]) 

order может сортировать по нескольким столбцам, если вы этого хотите.

0

Это приведет к максимальному увеличению для каждого города. Аналогичные результаты могут быть получены с использованием sort или order

# Generate some fake data 
codes <- paste("Code", 1:100, sep="") 
values <- matrix(0, ncol=20, nrow=100) 
for (i in 1:20) 
    values[,i] <- sample(0:100, 100, replace=T) 

df <- data.frame(codes, values) 

names(df) <- c("Code", paste("City", 1:20, sep="")) 

# Now for each city we get the maximum 
maxval <- apply(df[2:21], 2, which.max) 
# Output the max for each city 
print(cbind(paste("City", 1:20), codes[maxval])) 
Смежные вопросы