如何有效地计算R中一列和前一列的值之间的差异?

wnavrhmk  于 2023-06-03  发布在  其他
关注(0)|答案(4)|浏览(313)

我试图计算每一行的列值和前一列值之间的差异,例如:
我希望代码能做到以下几点:(第2列中的值-第1列中的值)、(第3列中的值-第2列中的值)、(第4列中的值-第3列中的值)等。
对于将计算值存储在如下新表中的输出:
我已经在一小部分列上手动完成了这一操作,如下所示,但是有没有代码可以更有效地在一大部分列/行上完成这一操作

#to calculate differences
diff_new = tab_new[,2] - tab_new[,1]
diff_new2 = tab_new[,3] - tab_new[,2]
diff_new3 = tab_new[,4] - tab_new[,3]
diff_new4 = tab_new[,5] - tab_new[,4]

#to create a new table with differences
diff.table_new = cbind(diff_new,diff_new2,diff_new3,diff_new4)
clj7thdc

clj7thdc1#

一个基本R选项是

df[-1] - df[-ncol(df)] # thanks @user20650

输出量

X2 X3
R1. 10 30
R2. 15 20
R3. 10 20

或者使用sapply

sapply(seq_len(ncol(df))[-1], function(x) df[,x] - df[,x-1])

输出:

[,1] [,2]
[1,]   10   30
[2,]   15   20
[3,]   10   20

数据

df <- read.table(text = "1   2   3   
R1. 50 60 90
R2. 80 95 115
R3. 90 100 120", h = TRUE)
fae0ux8s

fae0ux8s2#

diff有滞后:

df <- read.table(header = T, text = "    1   2   3   
R1. 50 60 90
R2. 80 95 115
R3. 90 100 120")

matrix(diff(unlist(df), lag=nrow(df)), nrow=nrow(df))
nwsw7zdq

nwsw7zdq3#

另一个完全矢量化的选项:

data.frame(t(diff(t(df))))

可以使用apply + diff

df <- read.table(header = T, text = "    1   2   3   
R1. 50 60 90
R2. 80 95 115
R3. 90 100 120")

t(apply(df, 1, diff))

#    X2 X3
#R1. 10 30
#R2. 15 20
#R3. 10 20
zu0ti5jz

zu0ti5jz4#

只要您的数据没有NA值,就可以使用data.tablecollapse
这里我们复制原始数据(第一列除外),并通过引用修改列。

library(data.table)
library(collapse)
# Take a copy
out <- copy(fselect(df, -1))

# Subtract lagged columns by reference
for (i in seq_col(out)){
  out[[i]] %-=% df[[i]]
}
out
#>     X2 X3
#> R1. 10 30
#> R2. 15 20
#> R3. 10 20

创建于2023-06-02使用reprex v2.0.2

数据

df <- read.table(header = T, text = "    1   2   3   
R1. 50 60 90
R2. 80 95 115
R3. 90 100 120")

相关问题