2015-01-25 13 views
5

Tôi đang cố gắng tìm ra các đối số cho gather trong gói tidyr.Trong tidyr, những gì tiêu chuẩn hiện các chức năng `thu thập` sử dụng để ánh xạ một dataframe từ rộng đến dài?

tôi nhìn vào tài liệu, và cú pháp trông giống như:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

Có một example trong tài liệu trợ giúp:

stocks <- data.frame(
    time = as.Date('2009-01-01') + 0:9, 
    X = rnorm(10, 0, 1), 
    Y = rnorm(10, 0, 2), 
    Z = rnorm(10, 0, 4) 
) 

gather(stocks, stock, price, -time) 

tôi tò mò về dòng cuối cùng:
gather(stocks, stock, price, -time)

Ở đây, stocks rõ ràng là dữ liệu chúng tôi muốn sửa đổi, điều đó là tốt.

Vì vậy, tôi có thể đọc rằng stockprice là đối số cho cặp giá trị khóa - nhưng cách chức năng này quyết định cách chọn cột để tạo cặp giá trị khóa này? Các dataframe gốc trông như thế này:

time  X   Y   Z 
2009-01-01 1.10177950 -1.1926213 -7.4149618 
2009-01-02 0.75578151 -4.3705737 -0.3117843 
2009-01-03 -0.23823356 -1.3497319 3.8742654 
2009-01-04 0.98744470 -4.2381224 0.7397038 
2009-01-05 0.74139013 -2.5303960 -5.5197743 

Tôi không thấy bất kỳ dấu hiệu cho thấy chúng ta nên sử dụng bất kỳ sự kết hợp của X, Y hoặc Z. Khi tôi đang sử dụng chức năng này, tôi cảm thấy như tôi chỉ chọn tên cho những gì tôi muốn các cột trong dataframe được định dạng dài của tôi được, và cầu nguyện rằng gather kỳ diệu hoạt động. Nghĩ lại thì, tôi cũng cảm thấy như vậy khi tôi sử dụng melt.

Có phải gather xem loại cột? Làm thế nào để nó bản đồ từ rộng đến dài?

EDIT Great câu trả lời dưới đây, thảo luận vĩ đại dưới đây, và cho bất cứ ai khác muốn biết thêm về triết lý và sử dụng của gói tidyr chắc chắn nên đọc paper này, mặc dù các họa tiết không giải thích cú pháp.

+0

'-time' nói để sử dụng tất cả các cột ngoại trừ thời gian. Cách tiếp cận khác sẽ là sử dụng 'thu thập (cổ phiếu, cổ phiếu, giá trị, X: Z)', nếu bạn muốn chỉ định cột nào nên được "thu thập". Hoặc thậm chí, 'thu thập (cổ phiếu, cổ phiếu, giá trị, X, Y, Z)'. Về cơ bản, điều này giống với việc sử dụng 'melt' với đối số' measure.vars' thay vì chỉ định 'id.vars' (' melt (stocks,(), (v, = "X", "Y", "Z")) '). – A5C1D2H2I1M1N2O1R2T1

Trả lời

11

Trong "tidyr", bạn chỉ định biến số đo cho gather trong đối số .... Đây là một chút khác biệt về khái niệm từ melt, trong đó nhiều ví dụ (thậm chí nhiều câu trả lời ở đây trên SO) sẽ hiển thị việc sử dụng đối số id.vars (với giả định rằng bất kỳ thứ gì không được chỉ định là ID là phép đo).

Đối số ... cũng có thể lấy tên cột -, như trong ví dụ bạn đã hiển thị. Điều này về cơ bản nói "thu thập tất cả các cột ngoại trừ cột này". Cách tiếp cận viết tắt khác trong gather bao gồm chỉ định một loạt các cột bằng cách sử dụng dấu hai chấm, ví dụ: gather(stocks, stock, price, X:Z).

Bạn có thể so sánh gather với melt bằng cách xem mã cho hàm. Dưới đây là một vài dòng đầu tiên:

> tidyr:::gather_.data.frame 
function (data, key_col, value_col, gather_cols, na.rm = FALSE, 
    convert = FALSE) 
{ 
    data2 <- reshape2::melt(data, measure.vars = gather_cols, 
     variable.name = key_col, value.name = value_col, na.rm = na.rm) 
+0

Hmm ...Thật buồn cười khi 'thu thập' chỉ là' bao bọc 'tan chảy'. Vậy điểm tạo ra nó là gì? –

+0

@DavidArenburg, tôi nghĩ rằng chỉ có một người biết câu trả lời cho điều đó. 'spread' không chỉ là' dcast', vì vậy có lẽ đây chỉ là một mẫu cho bây giờ? Nó có vẻ hơi khó xử với tôi rằng triết lý tổng thể giữa "reshape2" và "tidyr" phân kỳ một số tiền hợp lý, nhưng có lẽ đó là lý do tại sao nó là một gói hoàn toàn khác ... – A5C1D2H2I1M1N2O1R2T1

+3

@DavidArenburg điểm là 'gather()' là nói chung, dễ hiểu hơn nhiều đối với mọi người, và nó đối xứng với 'spread()' (không giống 'melt()' và 'cast()') – hadley

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