2016-01-15 2 views
0

Мне нужно сделать, чтобы рассчитать разницу между последовательными линиями. Есть ли умный способ сделать это? Решение ниже работает. ThanksСтрока строки строки 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, вы правы. Мне было любопытно другое решение. Ткс, снова. – x00

Смежные вопросы