2012-02-23 4 views
5

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

то, что у меня есть:

data1

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 
. . . . 
. . . . 
+3

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

ответ

5

diff использования, и придерживаться ЧА к началу результирующих векторов.

например.

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 
+0

Что делать, если x или y имеют некоторый NA? – user3841581

+0

@ user3841581 - тот же подход должен работать ... не так ли? – jbaums

8

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))) 
+0

+1 да, это немного чище, чем мой ответ. Хороший. – jbaums