Строка 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"

person x00    schedule 15.01.2016    source источник
comment
Вы имеете в виду все пары строк, а не последовательные строки?   -  person Spacedman    schedule 15.01.2016
comment
Возможный дубликат этого (первое попадание при поиске в Google R разница во всех парах).   -  person Henrik    schedule 15.01.2016
comment
это не все пары, position1‹position2   -  person x00    schedule 18.01.2016


Ответы (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
person Anders Ellern Bilgrau    schedule 15.01.2016
comment
С уважением, А.Е.Бильграу. Есть ли функция для получения 3-1? (порядок имеет значение) - person x00; 18.01.2016
comment
@Alex В вашей спецификации в вопросе и комментариях говорится, что вам не нужна эта комбинация? Но да, для этого есть функция. expand.grid дает вам все комбинации. Однако тип возвращаемого значения функций expand.grid отличается, поэтому код также отличается. Я обновил свой ответ. - person Anders Ellern Bilgrau; 19.01.2016
comment
А.Е.Бильграу, вы правы. Меня интересовало другое решение. Ткс, еще раз. - person x00; 20.01.2016