2012-02-04 55 views
1

我想根據後續行的比較對數據框中的列進行分類。ddply和分類函數

爲:

DF <- data.frame(respondent=rep(letters[1:2], each=5), response=c(1,1,2,2,1,3,1,1,1,1)) 
    respondent response 
1   a  1 
2   a  1 
3   a  2 
4   a  2 
5   a  1 
6   b  3 
7   b  1 
8   b  1 
9   b  1 
10   b  1 

我想添加新的列(例如:檢查),如果響應於在ROW2 ROW1 =響應和0的情況下,它們是不一樣的,輪流爲1。這應該針對每位受訪者單獨進行。

這會給我

respondent response check 
1   a  1 1 
2   a  1 0 
3   a  2 1 
4   a  2 0 
5   a  1 
6   b  3 0 
7   b  1 1 
8   b  1 1 
9   b  1 1 
10   b  1 

我想我可以用福爾循環算出來,但它似乎是ddply合適的問題...我只是不明白如何在相鄰解決比較行...

回答

3

這是一個很好的候選人plyr,因爲它分裂一個數據並應用一個函數然後返回數據。在這種情況下,您需要考慮整個response向量和一個相似的向量。

我在過去走近這個問題的辦法是:

shift.func <- function(df) { 
    lag<-c(df$response[-1],0) 
    df$check <- ifelse(df$response==lag,1,0) 

    return(df) 
} 

ddply(DF,.(respondent),shift.func) 
+0

這是一個偉大的想法 - 我沒有看到產生偏移向量進行比較的路徑 - 謝謝! – schultem 2012-02-04 21:54:53