R - сортировка и подстановка максимальных значений в столбцах - PullRequest
1 голос
/ 23 июля 2010

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

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

    *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

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

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

Ответы [ 3 ]

0 голосов
/ 23 июля 2010

Это выведет максимум для каждого города. Аналогичные результаты могут быть получены с использованием 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]))
0 голосов
/ 23 июля 2010

Я не совсем уверен, что вы хотите получить в соответствии с вашим примером сниппита. Вот как вы можете получить фрейм данных для каждого города, используя 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 голосов
/ 23 июля 2010

Один из способов использования 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 может сортировать по нескольким столбцам, если вы хотите.

...