Làm cách nào để thay đổi dữ liệu giữa các định dạng rộng và dài trong R? [đóng cửa]


32

Bạn có thể có dữ liệu ở định dạng rộng hoặc ở định dạng dài. Đây là một điều khá quan trọng, vì các phương thức có thể sử dụng là khác nhau, tùy thuộc vào định dạng. Tôi biết bạn phải làm việc với melt()cast()từ gói định hình lại, nhưng dường như có một số thứ tôi không nhận được.

Ai đó có thể cho tôi một cái nhìn tổng quan ngắn về cách bạn làm điều này?


Vui lòng cung cấp ví dụ về những gì bạn muốn đạt được. Chính xác thì bạn không nhận được gì?
mpiktas

3
Đây là bài viết trên blog của tôi với ví dụ về việc sử dụng meltcast. Có chuyển đổi từ định dạng rộng sang dài được thực hiện ở một giai đoạn. Thực sự không có gì đặc biệt hơn.
mpiktas

Chào mừng đến với số liệu thống kê. Bạn có thể thấy nó giúp bao gồm một bộ dữ liệu nhỏ, có thể tái tạo trong câu hỏi của bạn để giải thích những gì bạn muốn. Đọc sigmafield.org/2011/01/18/ Khăn để biết thêm.
PaulHurleyuk

Xem câu hỏi SO này cho nhiều cách để làm điều này.
Axeman

Câu trả lời:


26

Có một số tài nguyên trên trang web của Hadley Wickham cho gói (hiện được gọi là reshape2), bao gồm một liên kết đến một tờ giấy trên gói trong Tạp chí Phần mềm Thống kê.

Dưới đây là một ví dụ ngắn gọn từ bài báo:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Chúng tôi lưu ý rằng dữ liệu ở dạng rộng. Để chuyển sang dạng dài, chúng tôi làm cho smithskhung dữ liệu bị nóng chảy :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Lưu ý cách melt()chọn một trong các biến làm id, nhưng chúng ta có thể nói rõ ràng nên sử dụng thông qua đối số nào 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Đây là một ví dụ khác từ ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Nếu chúng ta lưu trữ các khung dữ liệu nóng chảy, chúng ta có thể đúc thành các hình thức khác. Trong phiên bản mới của reshape(được gọi reshape2), có các hàm acast()dcast()trả về kết quả giống như mảng (mảng, ma trận, vectơ) hoặc khung dữ liệu tương ứng. Các hàm này cũng có một hàm tổng hợp (ví dụ mean()) để cung cấp tóm tắt dữ liệu ở dạng nóng chảy. Ví dụ: tiếp theo từ ví dụ về Chất lượng không khí ở trên, chúng ta có thể tạo, ở dạng rộng, giá trị trung bình hàng tháng cho các biến trong tập dữ liệu:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

Có thực sự chỉ có hai chức năng chính trong reshape2: melt()acast()dcast()ghép nối. Nhìn vào các ví dụ trong các trang trợ giúp cho hai chức năng này, xem trang web của Hadley (liên kết ở trên) và xem bài báo tôi đã đề cập. Điều đó sẽ giúp bạn bắt đầu.

Bạn cũng có thể xem xét plyrgói của Hadley có chức năng tương tự reshape2nhưng được thiết kế để làm nhiều hơn thế nữa.


dcast(aqm, month ~ variable), cái này sẽ làm gì nếu không có hàm tổng hợp?
qed

@C giácSprite nó sẽ trả về số lượng quan sát cho mỗi biến. Đọc ?dcastmà sẽ nói với bạn điều này (xem chi tiết cho đối số fun.aggregate).
Phục hồi Monica - G. Simpson

8
  • Quick-R có ví dụ đơn giản về việc sử dụng gói định hình lại

  • Xem thêm ?reshape( LINK ) để biết cách di chuyển Base R giữa định dạng rộng và dài.


7

Bạn không phải sử dụng meltcast.

Định hình lại dữ liệu có thể được thực hiện rất nhiều cách. Trong ví dụ cụ thể của bạn về trích dẫn của bạn sử dụng recastvới aggregatelà dư thừa bởi vì aggregatenhiệm vụ hoàn toàn tốt cho chính nó.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Tôi thích làm thế nào, trong bài viết trên blog của bạn, bạn giải thích những gì meltđang làm. Rất ít người hiểu điều đó và một khi bạn nhìn thấy nó thì sẽ dễ dàng hơn để xem cách thức casthoạt động và cách bạn có thể viết các chức năng của riêng bạn nếu bạn muốn.



2

Chỉ cần lưu ý rằng không có tài liệu tham khảo nào về các phương pháp định hình lại hiệu quả và sâu rộng hơn ở data.tableđây, vì vậy tôi đang đăng mà không bình luận thêm câu trả lời xuất sắc của Zach / Arun trên StackOverflow cho một câu hỏi tương tự:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

Và đặc biệt có họa tiết tuyệt vời trên data.tabletrang GitHub:

https://github.com/Rdatitable/data.table/wiki/Getting-started

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.