2016-03-18 17 views
5

Hãy nói rằng tôi có bảng dữ liệu sau:Làm cách nào tôi có thể định hình lại dữ liệu. Có thể khi thứ tự của sổ đăng ký xác định danh mục?

dt=data.table(type=c('big','medium','small','small' 
        ,'medium','small','small' 
        ,'big','medium','small','small') 
      ,category=letters[1:11]) 

     type category 
1: big  a 
2: medium  b 
3: small  c 
4: small  d 
5: medium  e 
6: small  f 
7: small  g 
8: big  h 
9: medium  i 
10: small  j 
11: small  k 

Trong trường hợp này tôi có một hệ thống phân cấp loại: loại 'lớn' là như nhau cho tất cả các hàng cho đến khi một loại 'lớn' Sau đây là nhìn thấy. Và hành vi là như nhau đối với mọi loại.

Các Reshape Tôi muốn phải cho tôi như sau:

dt=data.table(type=c('big','medium','small','small' 
        ,'medium','small','small' 
        ,'big','medium','small','small') 
       ,category=letters[1:11]) 


    big medium small 
1: a  b  c 
2: a  b  d 
3: a  e  f 
4: a  e  g 
5: h  i  j 
6: h  i  k 

Như bạn có thể thấy mỗi loại chỉ thay đổi khi một thanh ghi cùng loại được tìm thấy, trật tự là rất quan trọng để thiết lập loại này.

Bạn có nghĩ rằng có cách để thực hiện việc này mà không cần sử dụng không?

Trả lời

8

Đây là phương pháp bạn có thể sử dụng. Bạn sẽ cần na.locf từ "vườn thú":

library(data.table) 
library(zoo) 

Trước tiên, chúng ta cần tìm ra các hàng cuối cùng. Để làm điều này, chúng ta cần phải xác định rõ ràng thứ tự của các loại là, vì bạn có thể bắt đầu từ cùng một dt và nhận được kết quả khác nhau, nếu thứ tự được thay đổi (đó là phần match). Một khi bạn có thứ tự số, nếu độ cách biệt ít hơn hoặc bằng số không, có nghĩa là nó sẽ là một hàng mới trong bảng mới:

dt[, rid := match(type, c('big', 'medium', 'small'))][, row := cumsum(diff(c(0, rid)) <= 0)] 

Đây là những gì các dữ liệu trông giống như bây giờ:

dt 
#  type category rid row 
# 1: big  a 1 0 
# 2: medium  b 2 0 
# 3: small  c 3 0 
# 4: small  d 3 1 
# 5: medium  e 2 2 
# 6: small  f 3 2 
# 7: small  g 3 3 
# 8: big  h 1 4 
# 9: medium  i 2 4 
#10: small  j 3 4 
#11: small  k 3 5 

ở đây nó được theo hình thức mà bạn đã yêu cầu:

na.locf(dcast(dt, row ~ type, value.var = "category")) 
# row big medium small 
# 1: 0 a  b  c 
# 2: 1 a  b  d 
# 3: 2 a  e  f 
# 4: 3 a  e  g 
# 5: 4 h  i  j 
# 6: 5 h  i  k 
+0

Cảm ơn bạn rất nhiều chàng trai ...:) ... tôi tự hỏi làm thế nào để bạn quản lý để đưa ra những câu trả lời, là nó giống như kinh nghiệm hay chỉ là tài năng? ... bạn có loại nền nào? –

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