如何通过数据集循环减去下一行中的值-使用R

如何通过数据集循环减去下一行中的值-使用R,r,R,我需要用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 -1 -1 -1 N/a 我不明白为什么,如果您能提供任何帮助,我们将不胜感激。正如@Sotos所指出的,您可以使用diff

我需要用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
-1
-1
-1
N/a

我不明白为什么,如果您能提供任何帮助,我们将不胜感激。

正如@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])
df您可以使用
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  
set.seed(42)
x x
[1] 10 10  3  9  7  6  8  2  7  8
>差异(x)
[1]  0 -7  6 -2 -1  2 -6  5  1
#差分矩阵法

lbd您正在寻找
diff
尝试
c(rev(diff(rev(df$X))),NA)
@markus我认为您的方法可以简化为
c(-diff(df$X),NA)
。但是如果要使用
diff
,他们不必使用
row
。你描述它的方式是误导感谢你对我的方法的帮助它是有效的,很好地了解diff function的家伙,会给它一个尝试。
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