Программирование на R: как вычислить разницу между двумя ячейками во фрейме данных и сохранить их в новом столбце

Пытаюсь выучить R и застрял на примере автокорреляции. Я хочу регрессировать разницу в x по сравнению с разницей в y. У меня есть x и y во фрейме данных, и я хотел бы, чтобы разница x2 - x1 была сохранена в новом столбце, скажем, dx. Я понятия не имею, как это сделать.

что я имею:

данные1

x   y
5   3
8   9
3   1
1   5
.   .
.   .
.   .

что я хотел бы получить:

data1.dif

x   y   dx   dy
5   3   NA   NA
8   9    3    6
3   1   -5   -8
1   5   -2    4
.   .    .    .
.   .    .    .

person Travis    schedule 23.02.2012    source источник
comment
Как говорится в двух ответах, diff делает это удобно, но если вы хотите вернуться к основам (т.е. забыть), посмотрите на data1[-1,] - data1[-nrow(data1),], который вы можете адаптировать для более сложных ситуаций.   -  person Henry    schedule 23.02.2012


Ответы (2)


Используйте diff и прикрепите NA к началу результирующих векторов.

e.g.

data1 <- read.table(text='  x y
1 5 3
2 8 9
3 3 1
4 1 5')

# diff calculates the difference between consecutive pairs of 
#  vector elements
diff(data1$x)
[1]  3 -5 -2

# apply diff to each column of data1, bind an NA row to the beginning,
#  and bind the resulting columns to the original df
data1.dif <- cbind(data1, rbind(NA, apply(data1, 2, diff)))
names(data1.dif) <- c('x', 'y', 'dx', 'dy')

data1.dif
  x y dx dy
1 5 3 NA NA
2 8 9  3  6
3 3 1 -5 -8
4 1 5 -2  4
person jbaums    schedule 23.02.2012
comment
что, если x или y имеют некоторое число NA? - person user3841581; 31.03.2016
comment
@user3841581 user3841581 - тот же подход должен работать ... не так ли? - person jbaums; 01.04.2016

Используйте diff с transform:

dat <- read.table(text="x   y
5   3
8   9
3   1
1   5", header=T)


transform(dat, dx=c(NA, diff(x)), dy=c(NA, diff(y)))

Урожайность:

  x y dx dy
1 5 3 NA NA
2 8 9  3  6
3 3 1 -5 -8
4 1 5 -2  4

А также dplyr:

library(dplyr)

dat %>%
    mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y)))
person Tyler Rinker    schedule 23.02.2012