Tôi gặp khó khăn trong việc tìm ra cách chuyển đổi dữ liệu từ định dạng dài sang định dạng rộng nhất khi tôi có nhiều biến số đo tôi muốn mang theo.Chuyển đổi dữ liệu từ định dạng dài sang định dạng rộng với nhiều cột số
Ví dụ: đây là khung dữ liệu đơn giản ở định dạng dài. ID được vấn đề này, thời gian là một biến thời gian, và X và Y là phép đo làm bằng ID vào TIME:
> my.df <- data.frame(ID=rep(c("A","B","C"), 5), TIME=rep(1:5, each=3), X=1:15, Y=16:30)
> my.df
ID TIME X Y
1 A 1 1 16
2 B 1 2 17
3 C 1 3 18
4 A 2 4 19
5 B 2 5 20
6 C 2 6 21
7 A 3 7 22
8 B 3 8 23
9 C 3 9 24
10 A 4 10 25
11 B 4 11 26
12 C 4 12 27
13 A 5 13 28
14 B 5 14 29
15 C 5 15 30
Nếu tôi chỉ muốn biến các giá trị của thời gian vào tiêu đề cột chứa bao gồm X, tôi biết tôi có thể sử dụng dàn diễn viên từ các gói Reshape (hoặc dcast từ reshape2):
> cast(my.df, ID ~ TIME, value="X")
ID 1 2 3 4 5
1 A 1 4 7 10 13
2 B 2 5 8 11 14
3 C 3 6 9 12 15
Nhưng những gì tôi thực sự muốn làm được cũng mang theo Y như là một biến đo lường, và có các tên cột phản ánh cả hai biện pháp tên biến và giá trị thời gian:
ID X_1 X_2 X_3 X_4 X_5 Y_1 Y_2 Y_3 Y_4 Y_5
1 A 1 4 7 10 13 16 19 22 25 28
2 B 2 5 8 11 14 17 20 23 26 29
3 C 3 6 9 12 15 18 21 24 27 30
(FWIW, tôi không thực sự quan tâm nếu tất cả dấu X đầu tiên được theo sau bởi Y, hoặc nếu chúng được xen kẽ như X_1, Y_1, X_2, Y_2, v.v.)
Tôi có thể đến gần bằng cách truyền dữ liệu dài hai lần và hợp nhất kết quả, mặc dù tên cột cần một số công việc và tôi cần phải chỉnh sửa nếu tôi cần thêm biến số thứ 3 hoặc thứ 4 ngoài X và Y:
merge(
cast(my.df, ID ~ TIME, value="X"),
cast(my.df, ID ~ TIME, value="Y"),
by="ID", suffixes=c("_X","_Y")
)
Có vẻ như một số kết hợp các hàm trong định dạng lại và/hoặc plyr sẽ có thể thực hiện điều này một cách tao nhã hơn là nỗ lực của tôi, cũng như xử lý nhiều biến số đo rõ ràng hơn. Một cái gì đó như cast (my.df, ID ~ TIME, giá trị = c ("X", "Y")), không hợp lệ. Nhưng tôi đã không thể hình dung ra được.
Mọi trình hướng dẫn R có thể giúp tôi không? Cảm ơn.
Tôi đã cố gắng để đánh giá mà giải pháp là nhanh nhất, nhưng không tìm thấy một vấn đề với mã của bạn nếu khung dữ liệu như sau: num.id = 10 num.time = 10 my.df <- data. frame (ID = rep (LETTERS [1: num.id], num.time), TIME = rep (1: num.time, each = num.id), X = 1: (num.id * num.time), Y = (num.id * num.time) +1: (2 * chiều dài (1: (num.id * num.time)))) –
Cảm ơn bạn rất nhiều. –
Tuyệt vời, cảm ơn Brian. Kể từ khi diễn viên dường như đang làm việc, tôi đã không nhận ra tan chảy vẫn còn cần thiết. –