2012-01-06 31 views
5

xin lỗi, vì tiêu đề khó hiểu tôi không tìm thấy bất kỳ tóm tắt nào tốt hơn cho vấn đề của mình. Vì vậy, đây là vấn đề của tôi: tôi có một dataframe và muốn làm cho diff() trên nhóm đó hoạt động tốt:ddply: cách bao gồm vectơ ký tự trong kết quả

df <- data.frame (name = rep(c("a", "b", "c"), 4), 
       index = rep(c("c1", "c2"), each=6), 
       year = rep(c(2008:2010),4), 
       value = rep(1:3, each=4)) 

head(df) 

    name index year value 

1 a c1 2008  1 
2 b c1 2009  1 
3 c c1 2010  1 

ddply(df, .(name, year), summarize, value=diff(value)) 

Tuy nhiên, tôi muốn bao gồm các index trong kết quả của tôi Mà tôi đã cố gắng để làm với:

ddply(df, .(name, year), summarize, value=diff(value), index=index) 

Tuy nhiên, điều này mang lại các thông báo lỗi:

length(rows) == 1 is not TRUE 

đó là tôi đoán vì chỉ số này có nhiều hàng bởi vì nó không được xử lý bởi diff. Có giải pháp nhanh cho vấn đề của tôi không?

Cảm ơn bạn rất nhiều!

EDIT

tôi cố gắng để làm rõ câu hỏi của tôi những gì tôi muốn thêm vào kết quả:

Giả sử biến index trên. Đây là một yếu tố nên giải thích điều gì đó. Tuy nhiên, tôi không thể mất diff() của nó mà sẽ không có ý nghĩa vì vậy tôi chỉ muốn vượt qua điều này mà không thay đổi bất cứ điều gì. Tôi đã cố gắng drop==FALSE mà đã mang lại cùng một messsage lỗi.

Nỗi buồn cho tất cả sự nhầm lẫn này! Dưới đây là một ví dụ rất đơn giản:

name year index value 
a 2008 c1 10 
a 2009 c2 30 
a 2010 c1 40 

sau khi uống của diff acroos nhóm 'a' này trông giống như:

name year index d.value 
a 2009 c2  +20 #c2 stayed the same just the first row got intentionally dropped. 
a 2010 c1  +10 

cân nhắc tên không may index như một cái gì đó giống như một thuộc tính: nó có thể thay đổi trong những năm qua nhưng sẽ không có ý nghĩa khi chụp diff()

Tôi thực sự hy vọng điều này mang lại cho bạn manh mối những gì tôi muốn - nếu không, tôi sẽ xóa câu hỏi này vì tôi thấy một giải pháp không quan tâm;) và xin lỗi vì mọi sự bất tiện!

+0

Bạn muốn xếp hàng chúng như thế nào? Đầu trả về sáu phần tử đầu tiên theo mặc định. – hadley

+0

đoán tôi đã không nhận được ý nghĩa của phần 'đầu()' mà tôi đã sao chép từ một câu trả lời khác. về cơ bản tôi muốn vượt qua một chỉ mục được gắn chặt với tên và năm nhưng với tần số cao hơn. tôi sẽ làm rõ câu hỏi của tôi! – Seb

+0

Và bạn muốn chỉ mục trông như thế nào. Một tập hợp con trong ddply có 4 hàng, diff có ba giá trị và hai giá trị đầu tiên có chỉ số c1 và hai thứ hai có chỉ mục c2. Giá trị chỉ số nào sẽ thuộc về điều đó? "c1-c2"? –

Trả lời

2

Tôi không hoàn toàn chắc chắn những gì bạn muốn, có vẻ như bạn muốn nhận được sự khác biệt, giữ biến chỉ mục và thả hàng đầu tiên của mỗi nhóm. Điều này giúp bạn có được những gì bạn muốn?

doSummary = function(df) { 
    values = diff(df$value) 
    indexes = df$index[2:length(df)] 
    data.frame(d.value=values, index=indexes) 
} 
ddply(df, .(name, year), doSummary) 
+0

phải mất một thời gian 'cho đến khi ai đó có thể giải mã lời giải thích khó hiểu của tôi nhưng có vẻ như đó là kết quả tôi đã cố gắng đạt được! cảm ơn rất nhiều! – Seb

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