如何从上一行、r中不同列的值中减去一列的值
我有一个由3列和~2000行组成的数据框架如何从上一行、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
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