2017-10-20 8 views
0

J'ai une base de données qui montre les résultats des élections par circonscription et par parti. J'ai besoin de trouver la partie avec le plus de votes pour chaque circonscription.R - Diffuser des données sur des lignes uniques - reshape2

Mon df ressemble à ceci

# gss  party   votes  
1 W07000049 Labour  22662  
2 W07000049 Conservative 5901  
3 W07000049 LibDem  941   
3 W07000058 Labour  5951 
3 W07000058 LibDem  1741 
3 W07000058 Conservative 852 

Je voudrais le jeter ainsi les noms de parti unique deviennent mes noms de colonnes, comme celui-ci

# gss  Labour Conservative LibDem 
1 W07000049 22662 5901   941 
2 W07000058 5951  1741   941 

Sur cette trame de données, je pourrais alors utiliser qui. max comme si

x$win <- colnames(df)[apply(df, 1, function(x) which.max(x)[1])] 

J'ai essayé d'utiliser dcast de reshape2 http://seananderson.ca/2013/10/19/reshape.html mais je suis unab le pour l'appliquer. Comment puis-je trouver la partie gagnante de chaque circonscription?

P.S. Je suis un débutant alors s'il vous plaît laissez-moi savoir si je peux expliquer cela mieux

+0

dans la base R, vous pouvez utiliser 'reshape':' remodeler (df, direction = "large", varID = "GSS", timevar = "partie") 'ou' xtabs': 'xtabs (votes ~ gss + partie, df) '. – lmo

Répondre

1

Voici une solution reshape2::dcast:

dcast(df, df[, 2] ~ df[, 3]) 

# Output 
# 1 W07000049   5901 22662 941 
# 2 W07000058   852 5951 1741 

Cela suppose la structure suivante de df

str(df) 
#'data.frame': 6 obs. of 4 variables: 
# $ V1: int 1 2 3 3 3 3 
# $ V2: Factor w/ 2 levels "W07000049","W07000058": 1 1 1 2 2 2 
# $ V3: Factor w/ 3 levels "Conservative",..: 2 1 3 2 3 1 
# $ V4: int 22662 5901 941 5951 1741 852 
+0

Cela fonctionne bien, merci beaucoup! – user3821345

0

Une autre reshape2::dcast Solution.

library(reshape2) 

molten <- melt(df) 
dcast(molten, gss ~ party, id.vars = "gss", value.var = "value") 
#  gss Conservative Labour LibDem 
#1 W07000049   5901 22662 941 
#2 W07000058   852 5951 1741 

Notez que la première étape est nécessaire, mais vous pouvez ignorer la création de la trame de données intermédiaire molten et simplement faire le one-liner dcast(melt(...)...).

DONNÉES.

df <- 
structure(list(gss = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("W07000049", 
"W07000058"), class = "factor"), party = structure(c(2L, 1L, 
3L, 2L, 3L, 1L), .Label = c("Conservative", "Labour", "LibDem" 
), class = "factor"), votes = c(22662L, 5901L, 941L, 5951L, 1741L, 
852L)), .Names = c("gss", "party", "votes"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))