簡體   English   中英

如何從上一行中的上一行中的值減去一列中的值

[英]how to subtract a value from one column from a value from a previous row, different column in r

我有一個由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'<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')]),"

我將不勝感激所有的評論/建議。

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

然后,您可以檢查一行是否在與上一行相同的“區域”內。

我們也可以嘗試data.table (類似於@David Arenburg的評論中建議的方法)。 shiftdevel版本中引入的新功能,默認type='lag' 可以從這里安裝

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM