2012-05-06 38 views
7

Tôi vừa trở lại R từ một văn bản gián đoạn dài và tôi đang gặp một số vấn đề thực sự nhớ cách định hình lại dữ liệu. Tôi biết rằng những gì tôi muốn làm là dễ dàng, nhưng vì một lý do nào đó tôi bị câm tối nay và đã nhầm lẫn bản thân mình với tan chảy và định hình lại. Nếu bất cứ ai có thể nhanh chóng chỉ cho tôi đúng hướng, nó sẽ được đánh giá rất cao.res.hình ảnh data.frame đơn giản

Tôi có một dataframe như vậy:

person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
.... 
personN x  y 

Tôi muốn kết thúc với một số các sự kiện theo năm và bởi người: (vì vậy mà tôi có thể vẽ biểu đồ đường kẻ nhanh chóng cho mỗi người trong năm)

ví dụ:

person year1 year2 
personA 4  2 
personB 0  2 

Rất cám ơn bạn đã đọc.

Trả lời

8

tôi có lẽ sẽ sử dụng reshape2 gói và dcast chức năng vì nó xử lý cả hai định hình lại và tập hợp trong một bước:

library(reshape2) 
> dcast(person ~ year, value.var = "year", data = dat) 
Aggregation function missing: defaulting to length 
    person 1 2 
1 personA 4 2 
2 personB 0 2 
+0

này là rất tốt - đã sử dụng Reshape trước nhưng không reshape2 - cảm ơn rất nhiều. – user1378122

7

Trong trường hợp này, bạn chỉ có thể sử dụng tapply:

> with(data, tapply(week, list(person=person, year=year), length)) 
     year 
person  1 2 
    personA 4 2 
    personB NA 2 

Kết quả là một ma trận. Giải pháp này tạo ra NA nếu có các ô trống.

+0

Tôi đã tự hỏi liệu có thể kết hợp 'NA' trong tuần vào giải pháp này hay không ... Một cách để thay đổi 'NA' trong tuần thành một giá trị kì lạ, nhưng tôi đã tự hỏi liệu có một giải pháp hộp ... Bất kỳ suy nghĩ nào? –

5

xtabs từ cơ sở R hoạt động rất tốt cho vấn đề này:

dat <- read.table(text="person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
", header=TRUE) 
xtabs(~person+year, data=dat) 
#----------------- 
     year 
person 1 2 
    personA 4 2 
    personB 0 2 

Bạn có thể vượt qua sản lượng của nó để matplot vì nó trả về một đối tượng bảng/ma trận:

matplot(xtabs(~person+year, data=dat)) 

Sản lượng trục x trên ví dụ nhỏ này có thể không phải là những gì bạn muốn nhưng với nhiều năm, có thể có một nhãn trục mặc định thỏa đáng hơn. Hoặc bạn có thể ngăn chặn các nhãn mặc định trục x với xaxt = "n" và sử dụng axis nhãn như bạn muốn:

matplot( xtabs(~person+year, data=dat), xaxt="n", type="b")