簡體   English   中英

在迭代for循環時保留對R數據幀的更改

[英]Preserving changes to R data frame while iterating through for loop

我是Stackexchange的新手,所以如果我不正確地提出這個問題,我會提前道歉。

這是背景。 我試圖根據春季的最后一天建立小麥的推薦種植日期,在干燥的夏季開始之前,人們可以合理地預計會看到至少10個以上的降雨。

我有一個如下所示的數據集:

    Site   Date Year DayOfYear DayofRun AveTemp MaxTemp MinTemp Precip TotPre
1 EelRiver 1/1/02 2002         1        1    53.6      57      51   1.01     NA
2 EelRiver 1/2/02 2002         2        2    52.5      64      43   1.30     NA
3 EelRiver 1/3/02 2002         3        3    46.6      60      42   0.56     NA
4 EelRiver 1/4/02 2002         4        4    45.7      57      41   0.00     NA
5 EelRiver 1/5/02 2002         5        5    51.0      57      46   0.53     NA
6 EelRiver 1/6/02 2002         6        6    57.9      60      55   1.70     NA

我想要做的是在TotPre列填充從該日期到8月1日的總降雨量。

我知道,理想情況下,我會避免使用顯式循環,但我感到困惑的是,似乎我需要計算一個基於我正在使用的觀察結果而變化的子集的總和。 所以,使用for循環,這是我嘗試這樣做的方式:

eelriverdata <- read.csv(file="EelRiverCamp.csv",head=TRUE,sep=",")

for (i in nrow(eelriverdata)) {

    tempYear <- eelriverdata[i,"Year"]
    AugIndex <- which(eelriverdata[,"Year"]==tempYear & eelriverdata[,"DayOfYear"] == 213)

    if (i < AugIndex) {
        Tot <- sum(eelriverdata[i:AugIndex,"Precip"])
        eelriverdata$TotPre[i] <- Tot
    }

    else {eelriverdata$TotPre[i] <- 0}

}

我遇到的問題是,只有TotPre中的最后一個觀察結果才會在執行循環結束時填充,剩下的值保持為NA。 在for循環的每次迭代中,值丟失或被覆蓋的地方都會發生一些事情。 我做了一些研究,但除了神秘的信息之外,還可以找到除了循環用數據框做出“意想不到的事情”的神秘信息。

那么,有誰知道:

a)如何通過迭代繼續對數據框進行更改? 我很想知道在使用循環操作數據幀時我可能會遇到的“意想不到的事情”。

和/或

b)更優雅的解決方案。 在做任何非常復雜的事情時,我很難使用apply,ddply等,也許我可以從這個例子中學習。

謝謝!

賈里德

這里不需要使用loop

  1. 使用ddply / transform按年分組並獲得data.frame作為結果
  2. 和積累來計算累積降水量
  3. 轉而前進

你只需要改變5Jan 1Aug(第213天):

library(plyr)
ddply(dat,.(Year),transform, 
     TotPrecp= ifelse(DayOfYear > 5, NA,rev(cumsum(Precip))))

結果如下:

  Site   Date Year DayOfYear DayofRun AveTemp MaxTemp MinTemp Precip TotPre TotPrecp
1 EelRiver 1/1/02 2002         1        1    53.6      57      51   1.01     NA     5.10
2 EelRiver 1/2/02 2002         2        2    52.5      64      43   1.30     NA     3.40
3 EelRiver 1/3/02 2002         3        3    46.6      60      42   0.56     NA     2.87
4 EelRiver 1/4/02 2002         4        4    45.7      57      41   0.00     NA     2.87
5 EelRiver 1/5/02 2002         5        5    51.0      57      46   0.53     NA     2.31
6 EelRiver 1/6/02 2002         6        6    57.9      60      55   1.70     NA       NA

要回答你關於循環的問題主要是因為它們的副作用是危險的:

for (i in 1:10) x <- 2             ## create a global variable x
lapply (1:10, function(z) x <- 2)  ## SAFE don't create a gloable variable x

沒有檢查你的代碼,但它應該是for (i in 1:nrow(eelriverdata)) {而不是for (i in nrow(eelriverdata)) {

以下是我的版本,你只用年份而不是所有行循環。

我不清楚一些問題,但嘗試這種方法

試試這個:

set.seed(5)
tempdf=data.frame(year=rep(2002:2006, each=365), dayofyear=rep(1:365, times=5), prec=runif(365*5), totpre=0)

years=unique(tempdf$year)
for (i in 1:length(years)){
totpreindex<-which(tempdf[,"year"]==years[i] & tempdf[,"dayofyear"]==213)
totpre<-sum(tempdf[tempdf$year==years[i] & tempdf$dayofyear>0  & tempdf$dayofyear<213,"prec"])
tempdf[totpreindex,"totpre"]<-totpre
}

輸出:

> tempdf[tempdf$totpre>0,]
     year dayofyear      prec   totpre
213  2002       213 0.4094868 108.9317
578  2003       213 0.2037912 109.2401
943  2004       213 0.3949180 112.0684
1308 2005       213 0.6600369 107.0455
1673 2006       213 0.5524957 102.6835

暫無
暫無

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

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