2014-09-19 22 views
12

Tôi có một khung dữ liệu mà tôi tan chảy bằng cách sử dụng gói định hình lại mà tôi muốn "không tan chảy".Làm thế nào để "unmelt" dữ liệu với reshape r

đây là một ví dụ đồ chơi của dữ liệu tan chảy (khung dữ liệu thực tế là 500x100 hoặc lớn hơn):

variable<-c(rep("X1",3),rep("X2",3),rep("X3",3)) 
value<-c(rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3),rep(rnorm(1,.5,.2),3)) 
dat <-data.frame(variable,value) 
dat 
variable  value 
1  X1 0.5285376 
2  X1 0.5285376 
3  X1 0.5285376 
4  X2 0.1694908 
5  X2 0.1694908 
6  X2 0.1694908 
7  X3 0.7446906 
8  X3 0.7446906 
9  X3 0.7446906 

Mỗi biến (X1, X2, X3) đã giá trị ước tính khoảng 3 thời điểm khác nhau (mà trong này ví dụ đồ chơi xảy ra giống nhau, nhưng điều này không bao giờ xảy ra).

Tôi muốn để có được nó (lại) theo hình thức:

 X1  X2  X3 
1 0.5285376 0.1694908 0.7446906 
2 0.5285376 0.1694908 0.7446906 
3 0.5285376 0.1694908 0.7446906 

Về cơ bản, tôi muốn cột biến để được sắp xếp trên ID (X1, X2 vv) và trở thành tiêu đề cột. Tôi đã thử hoán vị khác nhau của diễn viên, dcast, recast, vv .. và cant dường như để có được các dữ liệu ở định dạng mà tôi muốn. Thật dễ dàng để "làm tan chảy" dữ liệu từ dạng rộng đến dạng dài hơn (ví dụ: datset dat), nhưng việc lấy lại dữ liệu đã chứng tỏ là khó khăn. Bất kỳ ý tưởng? Tôi biết điều này là tương đối đơn giản, nhưng tôi đang có một thời gian khó khăn khái niệm làm thế nào để làm điều này trong reshape hoặc reshape2.

Cảm ơn, LP

+0

Đó là một chút khó khăn ở đây vì dữ liệu bị tan chảy của bạn đã mất thông tin về hàng nào ban đầu, đó là thông tin được ước tính gấp ba lần. Nếu bạn sẵn sàng cho rằng nó luôn luôn 1-2-3 theo thứ tự (hoặc 1-2, nếu chỉ có hai), bạn có thể tạo một hàng với thông tin đó và sau đó bỏ nó trở lại. – Aaron

Trả lời

19

Tôi thường làm điều này bằng cách tạo ra một cột id và sau đó sử dụng dcast:

> dat 
    variable  value 
1  X1 0.4299397 
2  X1 0.4299397 
3  X1 0.4299397 
4  X2 0.2531551 
5  X2 0.2531551 
6  X2 0.2531551 
7  X3 0.3972119 
8  X3 0.3972119 
9  X3 0.3972119 
> dat$id <- rep(1:3,times = 3) 
> dcast(data = dat,formula = id~variable,fun.aggregate = sum,value.var = "value") 
    id  X1  X2  X3 
1 1 0.4299397 0.2531551 0.3972119 
2 2 0.4299397 0.2531551 0.3972119 
3 3 0.4299397 0.2531551 0.3972119 
+2

Vì họ đề cập rằng số lượng giá trị có thể không nhất quán, có thể xem xét việc thay đổi 'dat $ id' thành' dat (ave, ave (rep (1, nrow (dat)), biến, FUN = seq_along)) '. – A5C1D2H2I1M1N2O1R2T1

+0

ahh, cảm ơn. Tôi đã thiếu id. Điều này làm việc tốt cho tập dữ liệu cụ thể này được tạo ra thông qua mô phỏng. –

1

Tùy thuộc vào cách mạnh mẽ bạn cần điều này là, sau đây sẽ một cách chính xác đúc cho khác nhau số lần xuất hiện các biến (và theo thứ tự bất kỳ).

> variable<-c(rep("X1",5),rep("X2",4),rep("X3",3)) 
> value<-c(rep(rnorm(1,.5,.2),5),rep(rnorm(1,.5,.2),4),rep(rnorm(1,.5,.2),3)) 
> dat <-data.frame(variable,value) 
> dat <- dat[order(rnorm(nrow(dat))),] 
> dat 
    variable  value 
11  X3 1.0294454 
8  X2 0.6147509 
2  X1 0.3537012 
7  X2 0.6147509 
9  X2 0.6147509 
5  X1 0.3537012 
4  X1 0.3537012 
12  X3 1.0294454 
3  X1 0.3537012 
1  X1 0.3537012 
10  X3 1.0294454 
6  X2 0.6147509 
> dat$id = numeric(nrow(dat)) 
> for (i in 1:nrow(dat)){ 
+ dat_temp <- dat[1:i,] 
+ dat[i,]$id <- nrow(dat_temp[dat_temp$variable == dat[i,]$variable,]) 
+ } 
> cast(dat, id~variable, value = 'value') 
    id  X1  X2  X3 
1 1 0.3537012 0.6147509 1.029445 
2 2 0.3537012 0.6147509 1.029445 
3 3 0.3537012 0.6147509 1.029445 
4 4 0.3537012 0.6147509  NA 
5 5 0.3537012  NA  NA 
Các vấn đề liên quan