2012-07-30 35 views
5

Giả sử chúng ta có một khung dữ liệu trông giống nhưTái một khung dữ liệu --- thay đổi hàng để cột

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 

Chúng tôi muốn định hình lại này để mỗi hàng đại diện cho một quận (nhà nước và), thay vì ngành công nghiệp hạt, với các cột construction.employment, construction.establishments và các phiên bản tương tự để sản xuất. Một cách hiệu quả để làm điều này là gì?

Một cách là tập hợp con

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

Và tương tự cho sản xuất, sau đó làm một hợp nhất. Điều này không quá tệ nếu chỉ có hai ngành, nhưng hãy tưởng tượng rằng có 14 ngành; quá trình này sẽ trở nên tẻ nhạt (mặc dù thực hiện ít hơn bằng cách sử dụng một vòng lặp for trên các mức độ industry).

Bất kỳ ý tưởng nào khác?

Trả lời

7

này có thể được thực hiện trong cơ sở R Reshape, nếu tôi hiểu câu hỏi của bạn một cách chính xác:

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

Cũng bằng cách sử dụng gói Reshape:

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

yielding:

> 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 

tôi cá nhân sử dụng cơ sở định hình lại vì vậy tôi có lẽ nên đã cho thấy điều này bằng cách sử dụng reshape2 (Wickham) nhưng quên có một reshape2 gói. Hơi khác:

library(reshape2) 
m <- reshape2::melt(data) 
dcast(m, state + county~...) 
+0

Ah, được rồi, tôi đang sử dụng '.' thay vì' ... ', vì vậy nó không hoạt động. Cảm ơn! – Charlie

Các vấn đề liên quan