Как перебрать набор данных, вычитая значение в строке ниже - Использование R - PullRequest
0 голосов
/ 29 января 2019

Мне нужна помощь по приведенному ниже вопросу на языке R.

Допустим, у меня есть набор данных:

X   Y
1   1
2   2
3   3
4   4

Как бы мне было выполнить цикл по набору данных, вычитая значение Xв текущей строке из значения X в строке ниже, затем перейдем ко второй строке и т. д.

В настоящее время у меня есть следующее:

df <- (df[row(df)-1,1] - df[row(df)+1,1])

Я хотел бы получить следующее:

X
-1
-1
-1
N/a

Однако, кажется, что я делаю вычисления дважды, и я получаю?

 X
-1
-1
-1
N/a
-1
-1
-1
N/a

Не могу понять, почему любая помощь будет признательна?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете использовать diff().Также вы можете сделать это, используя метод умножения матриц.

Пример

set.seed(42)
x <- sample(10, 10, replace=TRUE)
> x
[1] 10 10  3  9  7  6  8  2  7  8

> diff(x)
[1]  0 -7  6 -2 -1  2 -6  5  1

# difference matrix approach
lbd <- matrix(0, nrow=length(x) - 1, ncol=length(x))  # setup lambda
diag(lbd) <- -1
diag(lbd[, -1]) <- 1

> lbd
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   -1    1    0    0    0    0    0    0    0     0
 [2,]    0   -1    1    0    0    0    0    0    0     0
 [3,]    0    0   -1    1    0    0    0    0    0     0
 [4,]    0    0    0   -1    1    0    0    0    0     0
 [5,]    0    0    0    0   -1    1    0    0    0     0
 [6,]    0    0    0    0    0   -1    1    0    0     0
 [7,]    0    0    0    0    0    0   -1    1    0     0
 [8,]    0    0    0    0    0    0    0   -1    1     0
 [9,]    0    0    0    0    0    0    0    0   -1     1

> lbd %*% x  # matrix multiplication, same result as in `diff(x)` above
      [,1]
 [1,]    0
 [2,]   -7
 [3,]    6
 [4,]   -2
 [5,]   -1
 [6,]    2
 [7,]   -6
 [8,]    5
 [9,]    1  

Используя ваши данные:

x1 <- 1:4
lbd1 <- matrix(0, nrow=length(x1) - 1, ncol=length(x1))
diag(lbd1) <- -1
diag(lbd1[, -1]) <- 1

> lbd1 %*% x1
     [,1]
[1,]    1
[2,]    1
[3,]    1

> diff(x1)    # same
[1] 1 1 1
0 голосов
/ 29 января 2019

Как указал @Sotos, вы можете решить эту проблему с помощью diff.

Но причина, по которой это не работает, заключается в том, что row() возвращает номера строк для обоих столбцов

> row(df)
       [,1] [,2]
 [1,]    1    1
 [2,]    2    2
 [3,]    3    3
 [4,]    4    4

Если вы выберете один из столбцов, ваш код будет работать:

df <- (df[row(df)[,1]-1,1] - df[row(df)[,1]+1,1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...