如何从前一行的值中减去一列中的值,r中的不同列

时间:2015-03-14 20:47:45

标签: 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)是每行的唯一标识符。我希望我的脚本读取每一行,并从上一行的“DistB”列的值中减去/比较每行中“DistA”列的值。如果任何后续对的距离之差<40,则输出它们在相同区域中。 例如:在比较行2和1的上述示例中,来自行2的'239'和来自行1的'200'是&lt; 40并且因此在相同的区域中。相同的方式2和3处于相同的区域,即差异是2和2 <40。但第3行和第4行并不是因为差异是150。

我无法走远,因为我陷入了比较(减法/差异)步骤。我试图编写一个循环来迭代所有行,但我不断收到错误。我应该使用循环,还是可以在没有循环的情况下执行此操作?

我是一个新的R学习者,这是我到目前为止的“新手”代码。我哪里错了。提前致谢:

#the function to compare the two columns
funct <- function(x){
    for(i in 1:(nrow(dat)))
    (as.numeric(dat$DistA[i-1])) - (as.numeric(dat$DistB[i]))}

#creating a new column 'new2' with the differences
dat$new2 <- apply(dat[,c('DistB','DistA')]),1, funct

当我运行它时,我收到以下错误:

Error: unexpected ',' in "dat$new2 <- apply(dat[,c('DistB','DistA')]),"

我会感谢所有意见/建议。

2 个答案:

答案 0 :(得分:1)

我相信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))

这导致......

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

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

答案 1 :(得分:0)

我们也可以尝试data.table(类似于@David Arenburg评论中建议的方法)。 shiftdevel版本中引入的新功能,type='lag'为默认选项。它可以从here

安装
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

如果我们需要两者之间的差异&#39;和&#39;类别&#39;列

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