2010-03-08 31 views
12

Tôi có một khung dữ liệu trong đó một cột cụ thể có tập các giá trị cụ thể (giả sử, 1, 2, ..., 23). Những gì tôi muốn làm là chuyển đổi từ bố cục này sang bố cục, nơi khung sẽ có thêm 23 cột (trong trường hợp này), mỗi cột đại diện cho một trong các giá trị yếu tố. Các dữ liệu trong các cột này sẽ là boolean cho biết một hàng cụ thể đã có một yếu tố giá trị cho ... Để hiển thị một ví dụ cụ thể: KhungChia sẻ lại khung dữ liệu để chuyển đổi các yếu tố thành các cột trong R

Nguồn:

ID  DATE   SECTOR 
123  2008-01-01 1 
456  2008-01-01 3 
789  2008-01-02 5 
... <more records with SECTOR values from 1 to 5> 

định dạng mong muốn:

ID  DATE   SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5 
123  2008-01-01  T   F   F   F   F 
456  2008-01-01  F   F   T   F   F 
789  2008-01-02  F   F   F   F   T 

Tôi không gặp vấn đề gì trong vòng lặp nhưng tôi hy vọng sẽ có một cách tốt hơn. Cho đến nay reshape() không mang lại kết quả mong muốn. Trợ giúp sẽ được nhiều đánh giá cao.

Trả lời

14

Tôi sẽ cố gắng liên kết một cột khác được gọi là "giá trị" và đặt value = TRUE.

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

Sau đó làm một Reshape:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

Vấn đề với việc sử dụng reshape chức năng là mặc định cho các giá trị bị mất là NA (trong trường hợp này bạn sẽ phải lặp lại và thay thế chúng bằng FALSE) .

Nếu không, bạn có thể sử dụng cast trong số gói reshape (see this question for an example) và đặt mặc định thành FALSE.

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE) 
> df.wide 
    ID DATE  1  2  3 
1 1 2 TRUE FALSE FALSE 
2 2 3 FALSE TRUE FALSE 
3 3 4 FALSE FALSE TRUE 
4 4 5 TRUE FALSE FALSE 
5 5 6 FALSE TRUE FALSE 
6 6 7 FALSE FALSE TRUE 
7 7 8 TRUE FALSE FALSE 
8 8 9 FALSE TRUE FALSE 
9 9 10 FALSE FALSE TRUE 
10 10 11 TRUE FALSE FALSE 
+2

Cảm ơn bạn. Tôi nên nghĩ về việc tạo một cột giá trị. Thật thú vị, cách tiếp cận cột/định hình lại giá trị mất 1,4 giây trên 9.500 hàng với 26 mức yếu tố, trong khi sử dụng phương pháp lặp lại (trên mức) chỉ mất 0,6 giây. –

+3

Đừng bị lừa bởi các hàm này: chính hàm 'reshape' sẽ lặp lại nếu bạn nhìn vào nó. Nhưng nó làm nhiều thứ khác bên cạnh đó, mà sẽ thêm vào thời gian tổng thể. Những thứ như 'định hình lại' không có ý định thực hiện tốt hơn; họ chỉ có thể thực hiện thao tác dữ liệu dễ dàng hơn. – Shane

2

Đây là một cách tiếp cận sử dụng xtabs mà có thể hoặc không có thể nhanh hơn (nếu ai đó sẽ thử và cho tôi biết):

df <- data.frame(cbind(1:12, 2:13, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df) 
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo) 
Các vấn đề liên quan