我有一个由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')]),"
我会感谢所有意见/建议。
答案 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评论中建议的方法)。 shift
是devel
版本中引入的新功能,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