2013-07-30 63 views
6

Có cách nào trong R để chuyển đổi cột thành các hàng giữ tên của cột không?Chuyển đổi cột thành các hàng giữ tên của cột

Ví dụ đầu vào:

A B 
1 1 
2 3 
3 4 
44 5 

Output

Group Number 
    A  1 
    A  2 
    A  3 
    A  44 
    B  1 
    B  3 
    B  4 
    B  5 
+1

thuật ngữ tìm kiếm gì có bạn đã thử trước khi hỏi ở đây? – Roland

+0

Từ Buzz để tìm kiếm là "tan chảy", "truyền", "định hình lại", "rộng" và "dài". –

Trả lời

9

tôi sử dụng reshape2.

> x <- data.frame(A = 1:5, B = 55:51) 
> library(reshape2) 
> melt(x) 
Using as id variables 
    variable value 
1   A  1 
2   A  2 
3   A  3 
4   A  4 
5   A  5 
6   B 55 
7   B 54 
8   B 53 
9   B 52 
10  B 51 

Thật thú vị khi thấy điểm chuẩn. melt in thư theo mặc định mà chúng tôi có thể tắt bằng cách rõ ràng hơn khi gọi một hàm.

> microbenchmark(stack(DF), melt(DF), times=100) 
    Unit: milliseconds 
      expr  min  lq median  uq  max neval 
    stack(DF) 122.3086 133.8435 139.6990 180.5338 250.9316 100 
     melt(DF) 140.0183 198.2025 227.8125 245.3444 367.1552 100 

Tôi tìm thấy sự khác biệt nhỏ và nhỏ hơn khi in cho melt bị tắt. Có vẻ như linh cảm của tôi về chế độ tiết kiệm biến động trong các mô phỏng của tôi có thể đã giúp ích.

> microbenchmark(stack(DF), melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]), times=100) 
Unit: milliseconds 
                 expr  min  lq median  uq  max neval 
               stack(DF) 94.33681 124.9958 132.1747 144.7323 287.7438 100 
melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]) 99.44282 141.0594 150.2625 178.8081 249.0888 100 
10

Không cần phải sử dụng reshape2, bạn có thể sử dụng stack chức năng từ cơ sở-R:

Với your.data như ví dụ của bạn:

res <- stack(your.data) 
colnames(res) = c("Number", "Group") 

mang đến cho bạn

> res 
    Number Group 
1  1  A 
2  2  A 
3  3  A 
4  44  A 
5  1  B 
6  3  B 
7  4  B 
8  5  B 

Xem thêm here.


Benchmarking melt từ reshape2stack từ căn cứ trên dữ liệu lớn hơn:

require(reshape2) 
set.seed(45) 
DF <- data.frame(matrix(sample(20, 1e6, TRUE), ncol=100)) 

require(microbenchmark) 
microbenchmark(stack(DF), melt(DF), times=100) 

Unit: milliseconds 
     expr  min  lq median  uq  max neval 
stack(DF) 157.7084 187.1993 241.8206 251.7132 334.5488 100 
    melt(DF) 174.6079 253.1088 261.6234 273.3971 443.9953 100 

Có vẻ như stack là nhanh hơn, nhưng bằng lãi là 20 mili giây ...

+0

@Thomas, cũng sẽ hữu ích khi chỉnh sửa điểm chuẩn trong bài đăng (tốt hơn là với dữ liệu lớn hơn). – Arun

+0

@Thomas, không có vẻ nhanh gấp hai lần ... ít nhất với kích thước dữ liệu này. – Arun

+0

Nếu bạn có ý nghĩa bằng cách thực hiện "system.time", thì có, rất có thể sẽ không nhất quán. – Arun

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