2012-01-08 61 views
1

如果我有地區和候選人的選舉結果數據框,是否有一種簡單的方法可以在R的每個區域找到勝利者?也就是說,對於每一行,請選擇最大值該列的最大值?按標準*和* R數據框的每一行中的列名選擇列?

District CandidateA CandidateB CandidateC 
1   702   467   35 
2   523   642   12 
... 

所以我想在第2行,不僅702行1和642選擇,而且在排排從1「CandidateA」和「CandidateB」 2.

我問這是一個學習問題,因爲我知道我可以使用任何通用腳本語言(如Perl或Ruby)來完成此任務。也許R不是這個的工具,但似乎可能。謝謝。

回答

5
d <- read.table(textConnection(
"District CandidateA CandidateB CandidateC 
1   702   467   35 
2   523   642   12"), 
header=TRUE)     

d2 <- d[,-1] ## drop district number 
data.frame(winner=names(d2)[apply(d2,1,which.max)], 
      votes=apply(d2,1,max)) 

結果:

 winner votes 
1 CandidateA 702 
2 CandidateB 642 

你需要擔心的關係?請參閱whichwhich.max的幫助,他們以不同的方式處理關係...

+0

關於關係的好處,謝謝 – CodeEnthusiast 2012-01-08 16:52:10

1

如果這不是太雜亂,您可以嘗試運行for循環並使用cat打印結果。所以,如果你data.frame對象x

for(i in 1:length(x$District)) { 
    row <- x[i,] 
    max_row <- max(row[2:length(row)]) 
    winner_row <- names(x)[which(row==max_row)] 
    cat(winner_row, max_row, "\n") 
} 
+0

這很有道理,使用我熟悉的相同邏輯,謝謝。剛剛嘗試過它,並且完美地工作(這肯定會花費我一些時間來學習R語法。) – CodeEnthusiast 2012-01-08 15:18:06

+1

只注意到在第4行中,'which'函數是多餘的,因此您可以將它減少爲:'winner_row < - 名稱(x)[row == max_row]' – oeo4b 2012-01-08 15:53:14

+0

或者'winner_row < - 名稱(x)[which.max(row)]' – 2012-01-08 16:47:36

相關問題