[英]How to subtract one row value from another and assign the value to a different row all in the same column, by group, for multiple columns in R
[英]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的評論中建議的方法)。 shift
是devel
版本中引入的新功能,默認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.