如何通过数据集循环减去下一行中的值-使用R
我需要用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
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