簡體   English   中英

for循環R中的ifelse語句

[英]ifelse statement inside for loop R

我目前正在使用一個非常大的海拔數據集,我需要基於10m間隔的合並海拔高度為每行分配某些溫度。 因為數據集太大,所以我無法編寫簡單的循環。 我創建了一個較小的假數據集,以演示我要完成的工作。

elevation <- seq(0, 100, 10)

e <- runif(n=100,min=0,max=100)
lettertype <- c(rep("a", 25), rep("b", 25), rep("c", 50))
x <- data.frame(e, lettertype)

Winter <- runif(n=10, min=10, max=15)
Spring <- runif(n=10, min=12, max=16)
Summer <- runif(n=10, min=14, max=20)
Fall   <- runif(n=10, min=11, max=16)
elevbin <- c("0 to 10", "10 to 20", "20 to 30", "30 to 40", "40 to 50", 
              "50 to 60", "60 to 70", "70 to 80", "80 to 90", "90 to 100")
y <- data.frame(elevbin, Winter, Spring, Summer, Fall)

Wintertemp <- c()
for (i in 1:length(y$Winter)){
  for (j in 1:length(elevation)){
    for (k in 1:length(x$e)){
      Wintertemp <- c(Wintertemp, (ifelse(x$e[k] >= elevation[j] & x$e < elevation[j+1],  y$Winter[i], NA)))
    }
  }
}

本質上,elevation是一個向量,它將告訴for循環每個bin中的海拔(同樣,由於數據集的大小,它必須是自動化的,跨越200個height bins)。

  • 數據框x是我擁有的原始高程數據的示例,列“ lettertype”並不重要,它只是將矢量e轉換為數據框的附加組件。

  • 數據框y包含有關每個海拔箱中代表哪些溫度的信息(按季節,在此示例中,我僅使用“冬季”,但每個季節都需要這樣做)。

  • 我想將輸出綁定到數據框x

例如:

head(x)
          e lettertype
1  5.801268          a
2 99.115869          a
3 31.928297          a
4 25.886745          a
5 93.288743          a
6 23.496359          a

y
     elevbin   Winter
1    0 to 10 12.51486
2   10 to 20 14.14977
3   20 to 30 10.19768
4   30 to 40 12.63925
5   40 to 50 10.18445
6   50 to 60 10.91821
7   60 to 70 13.00326
8   70 to 80 11.89128
9   80 to 90 13.88241
10 90 to 100 12.33358

所以我希望我的結果是:

head(x)
          e lettertype   Winter
1  5.801268          a 12.51486
2 99.115869          a 12.33358
3 31.928297          a 12.63925
4 25.886745          a 10.19768
5 93.288743          a 12.33358
6 23.496359          a 10.19768

簡單來說,我想根據海拔箱中的溫度為數據框x中的每個海拔分配正確的溫度。

當前,該代碼返回一個長度為1100000的矢量,其中包含NA和冬季矢量中的第一個數字,這是不正確的。 結果應與x數據幀的長度相同。

任何幫助將是巨大的! 提前致謝!

不需要for循環或ifelse 如果先創建適當的列,則可以merge兩個數據框:

elevation <- seq(0, 100, 10)

e <- c(seq(0, 99, 1))
elev_floor <- 10 * floor(e / 10)
x <- data.frame(e, elev_floor)

Winter <- runif(n=10, min=10, max=15)
Spring <- runif(n=10, min=12, max=16)
Summer <- runif(n=10, min=14, max=20)
Fall   <- runif(n=10, min=11, max=16)
elevbin <- c("0 to 10", "10 to 20", "20 to 30", "30 to 40", "40 to 50", 
             "50 to 60", "60 to 70", "70 to 80", "80 to 90", "90 to 100")
elev_floor <- seq(0, 90, 10)
y <- data.frame(elevbin, elevmin, Winter, Spring, Summer, Fall)

merge(x, y)

結果:

      e elev_floor   elevbin elevmin   Winter   Spring   Summer     Fall
1     0          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
2     1          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
3     2          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
4     3          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
5     4          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
6     5          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
7     6          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
8     7          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
9     8          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
10    9          0   0 to 10       0 12.53781 13.01907 16.74989 15.22208
11   10         10   0 to 10       0 12.53781 13.01907 16.74989 15.22208
12   11         10   0 to 10       0 12.53781 13.01907 16.74989 15.22208
13   12         10   0 to 10       0 12.53781 13.01907 16.74989 15.22208
14   13         10   0 to 10       0 12.53781 13.01907 16.74989 15.22208

如果您的x$elev_floor比示例中的要復雜,則可以調整x$elev_floor的計算。

暫無
暫無

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

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