2010-07-23 58 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 2010-07-23 06:57:13

+0

是的,這很難找出你想要的東西。 – John 2010-07-23 07:13:52

+0

首先,我想獲得一個包含兩列數據的子集:列「city1」的10個最大值列表,與它們各自的「occ_codes」(來自第一列)相匹配。 這將是一個簡單的排序說excel,只有我需要重複操作300次* 10年的數據。 – AzadA 2010-07-23 07:55:15

回答

0

獲得我不完全相信你想要的輸出根據你的榜樣SNIPPIT。這裏是你如何能使用plyrreshape

#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 2010-07-23 20:52:21

0

一種方法是使用orderddply從包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

這將輸出每個城市的最大值。類似的結果可以用sortorder

# 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])) 
相關問題