我試圖在數據框中創建一個變量來引用前一行(在創建的變量中)來派生一個值。我對R相對來說比較陌生,我從excel中獲得了這種類型的自我引用和迭代更新功能,非常簡單。在R中計算一個自引用變量
mydata <- data.frame(trial = c(1,1,1,1,1,1,1,1,2,2),
fixation=c("","","aoi1","aoi1","","aoi3","aoi3","","",""),
trial.marker=c("","","","","","","",1,"",""))
mydata
trial fixation trial.marker
1
1
1 aoi1
1 aoi1
1
1 aoi3
1 aoi3
1 1
2
2
詳細背景:這是一個來自更大的數據集,我有眼動數據的樣本。每一行表示每13ms記錄一次觀察結果。固定變量指示了受試者在試驗中在該點看到的屏幕上的哪個位置。我的目標(現在)是計算每個試驗的首次注射指徵(每個試驗中受試者最先注意的是什麼)。我的方法是首先計算試驗標記以標記每次試驗的結束,然後計算第一個固定變量,該變量將掃描固定變量以獲得「aoi1」或「aoi3」的第一個「命中」,然後保留所有信息直到試驗結束(試驗標記),然後我用這個試驗標記爲數據框編制索引,爲每個試驗抽出一行摘要,我需要編寫各種類型的變量,我知道怎麼做的最好方法是通過計算這些類型的自引用變量
短背景:我需要計算一個變量,它將檢測每次試驗的固定變量中的第一個觀察結果, aoi1「或」aoi3「,並將該信息記錄在與trial.marker變量中的1值相同的行上。
我使用shift()函數來計算trial.marker,但是當引用同一個變量的前一行時,這不起作用。我已經得到了它的工作的唯一辦法是用可怕的循環:
for (i in 1:nrow(mydata)){
if(i == 1){mydata$first.fixation[i]<- ""}
else if (mydata$trial.marker[i-1]==1){mydata$first.fixation[i]<-""}
else if (mydata$first.fixation[i-1] == ""){
if(mydata$fixation[i] == "aoi1"){mydata$first.fixation[i] <- "aoi1"}
else if (mydata$fixation[i] == "aoi3"){mydata$first.fixation[i] <- "aoi3"}
else mydata$first.fixation[i] <- ""
}
else mydata$first.fixation[i] <- mydata$first.fixation[i-1]
}
mydata
trial fixation trial.marker first.fixation
1
1
1 aoi1 aoi1
1 aoi1 aoi1
1 aoi1
1 aoi3 aoi1
1 aoi3 aoi1
1 1 aoi1
2
2
我上運行該數據集有120萬行,並運行此花了約5個小時,所以我希望有一種更具計算效率的方法來處理它。
對不起,如果我的R語言很奇怪和/或我的帖子格式是可怕的。這是我的第一次堆棧溢出post =)希望事情足夠清楚,你可以理解我在這裏要做的事情。因爲我是R新手,我相信也可能有一種完全不同的方法來解決這個問題,但我不介意......但是誰知道。
戴夫,for循環中的「恐懼」大多是過去的事情。但是,如果您的代碼在for循環中「增長」了一個向量或其他對象,那麼效率會顯着下降。在所有編程語言中,尤其是R,在循環之前創建存儲對象。 (例如,數字矢量:'數字(長度= MyLength)'或數字矩陣'矩陣(0,myRows,myCols)')。如果你只是在修改一個對象,那麼這不是一個問題。也就是說,你使用for循環可以通過其他路線大大提高。 – lmo