如何从上一行、r中不同列的值中减去一列的值

如何从上一行、r中不同列的值中减去一列的值,r,function,dataframe,apply,difference,R,Function,Dataframe,Apply,Difference,我有一个由3列和~2000行组成的数据框架 ID DistA DistB 1 100 200 2 239 390 3 392 550 4 700 760 5 770 900 第一列(ID)是每行的唯一标识符。我希望我的脚本读取每一行,并将每一行“DistA”列的值与前一行“DistB”列的值相减/比较。如果任何后续对的距离差我相信dplyr可以在这里帮助您 library(dplyr

我有一个由3列和~2000行组成的数据框架

ID    DistA    DistB    
1    100    200    
2    239    390    
3    392    550    
4    700    760    
5    770    900

第一列(ID)是每行的唯一标识符。我希望我的脚本读取每一行,并将每一行“DistA”列的值与前一行“DistB”列的值相减/比较。如果任何后续对的距离差我相信dplyr可以在这里帮助您

library(dplyr)

dfData <- data.frame(ID = c(1, 2, 3, 4, 5), 
                     DistA = c(100, 239, 392, 700, 770), 
                     DistB = c(200, 390, 550, 760, 900))

dfData <- mutate(dfData, comparison = DistA - lag(DistB))

然后,您可以检查一行是否与前一行在同一“区域”内。

我们也可以尝试
data.table
(类似于@David Arenburg评论中建议的方法)
shift
devel
版本中引入的一个新功能,默认选项为
type='lag'
。它可以从以下位置安装:

library(data.table)#data.table_1.9.5
setDT(df1)[,Categ:=c('Diff','Same'))[
(abs(DistA shift(DistB))<40)+1L][]
#分类识别区
#1:1100 200 NA
#2:2 239 390相同
#3:3392550相同
#4:4700760差异
#5:5770900相同
如果我们同时需要“差异”和“类别”列

setDT(df1)[,c('Dist', 'Categ'):={tmp= abs(DistA-shift(DistB))
               list(tmp, c('Diff', 'Same')[(tmp <40)+1L])}]
 df1
 #   ID DistA DistB Dist Categ
 #1:  1   100   200   NA    NA
 #2:  2   239   390   39  Same
 #3:  3   392   550    2  Same
 #4:  4   700   760  150  Diff
 #5:  5   770   900   10  Same
setDT(df1)[,c('Dist','Categ'):={tmp=abs(DistA shift(DistB))

list(tmp,c('Diff','Same')[(tmp Hi,我会尝试将B列复制到一个单独的变量中,将其移位,然后以通常的方式将其减除。无论如何,在调用apply时检查括号。尝试
library(dplyr);df%>%mutate(Dist=ifelse(abs(DistA-lag(DistB))<40,“Same”,“Diff”)
library(dplyr)

dfData <- data.frame(ID = c(1, 2, 3, 4, 5), 
                     DistA = c(100, 239, 392, 700, 770), 
                     DistB = c(200, 390, 550, 760, 900))

dfData <- mutate(dfData, comparison = DistA - lag(DistB))
dfData
  ID DistA DistB comparison
1  1   100   200         NA
2  2   239   390         39
3  3   392   550          2
4  4   700   760        150
5  5   770   900         10
library(data.table)#data.table_1.9.5
setDT(df1)[, Categ := c('Diff', 'Same')[
             (abs(DistA-shift(DistB)) < 40 )+1L]][]
 #   ID DistA DistB Categ
 #1:  1   100   200   NA
 #2:  2   239   390 Same
 #3:  3   392   550 Same
 #4:  4   700   760 Diff
 #5:  5   770   900 Same
setDT(df1)[,c('Dist', 'Categ'):={tmp= abs(DistA-shift(DistB))
               list(tmp, c('Diff', 'Same')[(tmp <40)+1L])}]
 df1
 #   ID DistA DistB Dist Categ
 #1:  1   100   200   NA    NA
 #2:  2   239   390   39  Same
 #3:  3   392   550    2  Same
 #4:  4   700   760  150  Diff
 #5:  5   770   900   10  Same