2012-07-30 9 views
5

Załóżmy, że mamy ramkę danych, który wygląda jakZmiana kształtu ramki danych --- zmianę wierszy do kolumn

set.seed(7302012) 

county   <- rep(letters[1:4], each=2) 
state   <- rep(LETTERS[1], times=8) 
industry  <- rep(c("construction", "manufacturing"), 4) 
employment  <- round(rnorm(8, 100, 50), 0) 
establishments <- round(rnorm(8, 20, 5), 0) 

data <- data.frame(state, county, industry, employment, establishments) 

    state county  industry employment establishments 
1  A  a construction  146    19 
2  A  a manufacturing  110    20 
3  A  b construction  121    10 
4  A  b manufacturing   90    27 
5  A  c construction  197    18 
6  A  c manufacturing   73    29 
7  A  d construction   98    30 
8  A  d manufacturing  102    19 

Chcielibyśmy przekształcić to tak, że każdy wiersz reprezentuje (stan) i powiatu, raczej niż w przemyśle powiatowym, z kolumnami construction.employment, i analogicznymi wersjami do produkcji. Jaki jest skuteczny sposób na zrobienie tego?

Jednym ze sposobów jest podzbiór

construction <- data[data$industry == "construction", ] 
names(construction)[4:5] <- c("construction.employment", "construction.establishments") 

i podobnie do produkcji, a następnie wykonaj korespondencji seryjnej. Nie jest tak źle, jeśli istnieją tylko dwa branże, ale wyobraź sobie, że jest ich 14; proces ten stałby się żmudny (choć w mniejszym stopniu dzięki zastosowaniu pętli for na poziomach industry).

Jakieś inne pomysły?

Odpowiedz

7

Można to zrobić w bazie R zmienią, jeśli dobrze rozumiem pytanie poprawnie:

reshape(data, direction="wide", idvar=c("state", "county"), timevar="industry") 
# state county employment.construction establishments.construction 
# 1  A  a      146       19 
# 3  A  b      121       10 
# 5  A  c      197       18 
# 7  A  d      98       30 
# employment.manufacturing establishments.manufacturing 
# 1      110       20 
# 3      90       27 
# 5      73       29 
# 7      102       19 
4

używając także pakiet przekształcenia:

library(reshape) 
m <- reshape::melt(data) 
cast(m, state + county~...) 

otrzymując:

> cast(m, state + county~...) 
    state county construction_employment construction_establishments manufacturing_employment manufacturing_establishments 
1  A  a      146       19      110       20 
2  A  b      121       10      90       27 
3  A  c      197       18      73       29 
4  A  d      98       30      102       19 

I osobiście używaj zmiany kształtu bazy, więc prawdopodobnie powinienem był to pokazać używając reshape2 (Wickham), ale zapomniałem, że Pakiet reshape2. Nieco inny:

+0

Ah, ok, użyłem '.' zamiast' ... ', więc to nie działało. Dzięki! – Charlie

Powiązane problemy