2016-01-15 51 views
0

我需要做的是計算連續行之間的差異。 有沒有一個聰明的方法來做到這一點? 下面的解決方案工作。謝謝R行操作行i - 行j

pos=data.frame(position=c(1,2,3),value=c(1.3,2.7,3.1)) 
    position value 
    1  1 1.3 
    2  2 2.7 
    3  3 3.1 

r=NULL; rnome=NULL 
for(i in seq(1,length(pos[,1])-1)) 
    for(j in seq(i+1,length(pos[,1]))) 
     r=rbind(r,c(levels=paste0(pos$level[i],'-', pos$level[j]), dif=pos$value[j]-pos$value[i])) 

> r 
    levels dif 
[1,] "1-2" "1.4" 
[2,] "1-3" "1.8" 
[3,] "2-3" "0.4" 
+0

您的意思是「所有行對」而不是「連續」行嗎? – Spacedman

+0

[this]的可能重複(http://stackoverflow.com/questions/2615907/operate-on-pairs-of-rows-of-a-data-frame)(當谷歌搜索「R差異所有對」時首先擊中) 。 – Henrik

+0

它不是全部對,位置1 <位置2 – x00

回答

1

combn函數可以幫助你推廣一下代碼。這看起來更加優雅:

pos <- data.frame(position=c(1,2,3),value=c(1.3,2.7,3.1)) 

ans <- data.frame(levels = combn(pos$position, 2, FUN = paste, collapse = "-"), 
        dif = combn(pos$value, 2, FUN = diff)) 
print(ans) 
# levels dif 
#1 1-2 1.4 
#2 1-3 1.8 
#3 2-3 0.4 

# Get all combinations: 
comb <- expand.grid(pos$position, pos$position) 
lvls <- with(comb, paste0(Var1, "-", Var2)) 
difs <- with(comb, Var1 - Var2) 
ans2 <- data.frame(levels = lvls, dif = difs) 
print(ans2) 
# levels dif 
#1 1-1 0 
#2 2-1 1 
#3 3-1 2 
#4 1-2 -1 
#5 2-2 0 
#6 3-2 1 
#7 1-3 -2 
#8 2-3 -1 
#9 3-3 0 
+0

Tks,AEBilgrau。是否有獲得「3-1」的功能? (訂單事項) – x00

+0

@Alex您在問題和評論中的規格說明您不想要那種組合?但是,是的,它有一個功能。 'expand.grid'可以獲得所有組合。雖然'expand.grid'函數的返回類型不同,所以代碼也不同。我已經更新了我的答案。 –

+0

AEBilgrau,你是對的。我很好奇其他解決方案。 Tks,再次。 – x00