2013-08-02 1 views
3

J'ai une table de grand format avec les 3 premières lignes utilisées pour décrire les données qui sont montrées dans le tableau. Par exemple:Fusion de plusieurs lignes

Company:    | Company A | Company B | Company C |  | Company N 
Data source:   | Budget  | Actual  | Budget  | ... | ... 
Currency:    | USD  | EUR  | USD  |  | ... 
Indicator: 
Sales     500   1000   1500  ...  ... 
Gross Income    200   300   400  ...  ... 
...      ...   ...   ...  ...  ... 
Indicator J    ...   ...   ...  ... 

Je veux remodeler au format de long avec la mise en page suivante:

Indicator | Company | Currency | Data Source | Value 
Sales | Company A | USD | Budget  | 500 
Sales | Company B | EUR | Actual  | 1000 
...  | ... | ... | ...  | ... 

J'ai essayé de fondre avec le paquet reshape2, mais n'a pas réussi à convertir les lignes 2 et 3 aux variables

dput(AAA) 
structure(list(V1 = structure(c(1L, 8L, 2L, 5L, 7L, 4L, 3L, 6L 
), .Label = c("Company:", "Currency:", "EBITDA", "Gross Income", 
"Indicator:", "Net Income", "Sales", "Source:"), class = "factor"), 
    V2 = structure(c(7L, 6L, 8L, 1L, 2L, 5L, 3L, 4L), .Label = c("", 
    "1000", "150", "25", "300", "Budget", "Company A", "USD"), class = "factor"), 
    V3 = structure(c(7L, 6L, 8L, 1L, 2L, 5L, 3L, 4L), .Label = c("", 
    "1500", "175", "30", "400", "Actual", "Company B", "USD"), class = "factor"), 
    V4 = structure(c(7L, 6L, 8L, 1L, 3L, 5L, 2L, 4L), .Label = c("", 
    "185", "2000", "45", "500", "Budget", "Company C", "EUR"), class = "factor"), 
    V5 = structure(c(7L, 6L, 8L, 1L, 3L, 5L, 2L, 4L), .Label = c("", 
    "195", "2500", "50", "700", "Actual", "Company D", "EUR"), class = "factor")), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-8L)) 
+3

s'il vous plaît 'dput' les données afin qu'il puisse être reproduit – Metrics

Répondre

2

Voici une solution, implique de transposer vos données et de faire un peu de nettoyage. Le repos est fait par « fonte »:

AAA <- structure(list(V1 = structure(c(1L, 8L, 2L, 5L, 7L, 4L, 3L, 6L 
), .Label = c("Company:", "Currency:", "EBITDA", "Gross Income", 
       "Indicator:", "Net Income", "Sales", "Source:"), class = "factor"), 
       V2 = structure(c(7L, 6L, 8L, 1L, 2L, 5L, 3L, 4L), .Label = c("", 
                      "1000", "150", "25", "300", "Budget", "Company A", "USD"), class = "factor"), 
       V3 = structure(c(7L, 6L, 8L, 1L, 2L, 5L, 3L, 4L), .Label = c("", 
                      "1500", "175", "30", "400", "Actual", "Company B", "USD"), class = "factor"), 
       V4 = structure(c(7L, 6L, 8L, 1L, 3L, 5L, 2L, 4L), .Label = c("", 
                      "185", "2000", "45", "500", "Budget", "Company C", "EUR"), class = "factor"), 
       V5 = structure(c(7L, 6L, 8L, 1L, 3L, 5L, 2L, 4L), .Label = c("", 
                      "195", "2500", "50", "700", "Actual", "Company D", "EUR"), class = "factor")), .Names = c("V1", 
                                             "V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
                                                            -8L)) 
# transpose data 
dft <- data.frame(t(AAA), stringsAsFactors=FALSE) 

require(reshape2) 
# set colnames 
colnames(dft) <- dft[1, ] 
dft <- dft[-1, ] 

# remove empty indicator col 
dft[ , 4] <- NULL 

# melt data 
melt(dft, id.vars=c('Company:', 'Source:', 'Currency:'), variable.name='Indicator:') 

# Company: Source: Currency: Indicator: value 
# 1 Company A Budget  USD  Sales 1000 
# 2 Company B Actual  USD  Sales 1500 
# 3 Company C Budget  EUR  Sales 2000 
# 4 Company D Actual  EUR  Sales 2500 

Peut-être que vous aurez besoin d'un nettoyage plus (maintenant chaque col est le caractère, peut-être également mis les colnames avant de transposer ...).

+0

+1. Peut-être quelque chose comme ce qui suit est également utile: 'data.frame (lapply (x1, fonction (x) type.convert (as.character (x))))' (où "x1" est le résultat de votre commande 'melt'). – A5C1D2H2I1M1N2O1R2T1

Questions connexes