jeudi 6 août 2015

individual if statem. ok, multiple similar if statem. in for loop produces NA's

i wrote a function where the individual if statements execute ok. If I place them in a for loop I get NA's as a result. I can't find my error.

Total data:

       ID          L          a          b         DE       heightmm  L1        C       h         SDL        SDa        SDb
1      ClearHelder 58.83333  -2.2566667   1.070000 58.88333 17.666667 58.83333  2.50000 154.58333 1.6015721 0.08386497 0.09165151
2      Donkerblauw 32.26000  -0.3266667 -20.000000 37.97333 18.666667 32.26000 20.00333 269.06667 1.8712830 0.10692677 0.28844410
3      Donkerbruin 28.94333   5.1400000  14.843333 32.93333 21.666667 28.94333 15.71333  70.90000 0.6978777 0.17000000 0.58320951
4       Donkergeel 63.95667  -7.4466667  64.166667 90.91333 14.333333 63.95667 64.60000  96.62000 0.7595613 0.63263997 2.22554113
5      Donkergroen 37.16667 -23.6800000  14.546667 46.50333 10.333333 37.16667 27.79333 148.44667 2.7307569 0.45639895 0.67352308
6     Donkeroranje 49.57000  27.5033333  44.026667 71.78667  9.666667 49.57000 51.92000  58.01333 0.6242596 1.34001244 0.88793769
7  Donkerroodpaars 29.04333  31.3800000  10.813333 44.11000 16.000000 29.04333 33.18667  18.84333 0.8207517 0.94620294 0.49217206
8       Lichtblauw 45.72667  -5.7100000 -15.270000 48.54667 23.666667 45.72667 16.30333 249.48333 1.5023093 0.11269428 0.28160256
9       Lichtbruin 32.04500   5.4100000  14.105000 35.43000  7.500000 32.04500 15.10500  68.98000 0.4313351 0.15556349 0.61518290
10     Lichtekleur 51.35167   5.6366667  24.020000 56.99667 19.166667 51.35167 24.69667  76.68667 0.7655695 0.98627920 1.85564005
11  Lichtgroenturq 45.85333 -22.5466667   2.786667 51.18333  8.333333 45.85333 22.71667 172.96333 1.6453672 0.68002451 0.32807519
12       Opakblauw 42.67333 -15.7466667 -31.030000 55.07000 11.333333 42.67333 34.81000 243.09333 1.4786931 1.07342132 0.51507281
13        Opakgeel 73.33333   7.5233333  46.960000 87.41667  8.666667 73.33333 47.59667  80.88667 2.4552868 0.25716402 1.87032083
14      Opakoranje 55.70667  34.0666667  51.026667 82.90667  7.333333 55.70667 61.26000  52.87667 2.8837707 0.73432509 3.61903763
15        Opakrood 39.53333  38.4266667  21.303333 57.30333  8.333333 39.53333 43.95333  28.93000 5.4392769 1.78146943 2.51213720
16         Witopak 83.64000  -1.2566667   1.333333 83.66000 10.333333 83.64000  1.85000 134.26000 0.6187891 0.09865766 0.40869712
   SDDE       SDheightmm SDL1     SDC          SDh      hex
1  1.6015721  1.1547005 1.6015721 0.03605551  2.6510815 #8A8F8C
2  1.4758500  1.5275252 1.8712830 0.28290163  0.3265476 #354E6B
3  0.5753550  0.5773503 0.6978777 0.60177515  0.3395585 #54412E
4  1.6346967  1.5275252 0.7595613 2.24006696  0.5111751 #AC9C14
5  1.7712801  1.1547005 2.7307569 0.73934656  0.7169612 #34613F
6  0.8957864  0.5773503 0.6242596 1.07670795  1.3266625 #B0622A
7  0.6260192  1.0000000 0.8207517 1.04987301  0.5450076 #732E35
8  1.5027419  0.5773503 1.5023093 0.27790886  0.4292241 #507085
9  0.1697056  0.7071068 0.4313351 0.51618795  1.3717872 #5B4836
10 1.0754844  3.7638633 0.7655695 1.72036818  2.8469891 #917652
11 1.3748576  0.5773503 1.6453672 0.70528954  0.6739683 #3F7767
12 1.2285357  1.5275252 1.4786931 0.15524175  1.9444879 #466889
13 1.7842178  1.1547005 2.4552868 1.85564903  0.6591914 #DBAD5D
14 3.2132434  1.5275252 2.8837707 2.94001701  4.2746852 #CC6B2B
15 0.8280902  1.5275252 5.4392769 2.75884638  1.8218946 #9C3F3D
16 0.6255398  0.5773503 0.6187891 0.25357445 10.3321198 #CFD1CE

Trun data:

Sample        Time     L     C    h      L1     a     b    DE    heihgtmm  hex
1 Sample 1 10:51:04 AM 57.61 4.56 219.98 57.61 -3.49 -2,93 36.52    53.10 <NA>
2 Sample 2 10:51:05 AM 57.16 4.17 226.13 57.16 -2.89 -3,01 36.95    67.01 <NA>
3 Sample 3 10:51:06 AM 53.96 5.14 233.39 53.96 -3.06 -4,13 40.24    80.16 <NA>
4 Sample 4 10:51:07 AM 57.30 3.90 221.78 57.30 -2.91  -2,6 36.78    85.30 <NA>
5 Sample 5 10:51:08 AM 55.27 3.63 213.56 55.27 -3.03 -2,01 38.77    86.37 <NA>
6 Sample 6 10:51:09 AM 57.90 3.47 214.16 57.90 -2.87 -1,95 36.13    92.36 <NA>

The code for one line execution:

for(i in 1:nrow(Trun)){
 if (Trun$L[i] > Total$L[1]-Total$SDL[1] & Trun$L[i] < Total$L[1]+Total$SDL[1]){
 Trun$hex[i] <- Total$hex[1]
}}

This gives the right result:

Sample        Time     L     C    h      L1     a     b    DE   heihgtmm     hex
1 Sample 1 10:51:04 AM 57.61 4.56 219.98 57.61 -3.49 -2,93 36.52    53.10 #8A8F8C
2 Sample 2 10:51:05 AM 57.16 4.17 226.13 57.16 -2.89 -3,01 36.95    67.01    <NA>
3 Sample 3 10:51:06 AM 53.96 5.14 233.39 53.96 -3.06 -4,13 40.24    80.16    <NA>
4 Sample 4 10:51:07 AM 57.30 3.90 221.78 57.30 -2.91  -2,6 36.78    85.30 #8A8F8C
5 Sample 5 10:51:08 AM 55.27 3.63 213.56 55.27 -3.03 -2,01 38.77    86.37    <NA>
6 Sample 6 10:51:09 AM 57.90 3.47 214.16 57.90 -2.87 -1,95 36.13    92.36 #8A8F8C

Making a function with multiple similar statements in a variable:

colortest <- function(x){
for ( i in 1:nrow(x)){
    if (x$L[i] > Total$L[1]-Total$SDL[1] & x$L[i] < Total$L[1]+Total$SDL[1]){
        x$hex[i] <- Total$hex[1]
    }else if(x$L[i] > Total$L[2]-Total$SDL[2] & x$L[i] < Total$L[2]+Total$SDL[2]){
        x$hex[i] <- Total$hex[2]
    }else if (x$L[i] > Total$L[3]-Total$SDL[3] & x$L[i] < Total$L[3]+Total$SDL[3]){
        x$hex[i] <- Total$hex[3]
    }else if (x$L[i] > Total$L[4]-Total$SDL[4] & x$L[i] < Total$L[4]+Total$SDL[4]){
        x$hex[i] <- Total$hex[4]
    }else if (x$L[i] > Total$L[5]-Total$SDL[5] & x$L[i] < Total$L[5]+Total$SDL[5]){
        x$hex[i] <- Total$hex[5]
    }else if (x$L[i] > Total$L[6]-Total$SDL[6] & x$L[i] < Total$L[6]+Total$SDL[6]){
        x$hex[i] <- Total$hex[6]
    }else if (x$L[i] > Total$L[7]-Total$SDL[7] & x$L[i] < Total$L[7]+Total$SDL[7]){
        x$hex[i] <- Total$hex[7]
    }else if (x$L[i] > Total$L[8]-Total$SDL[8] & x$L[i] < Total$L[8]+Total$SDL[8]){
        x$hex[i] <- Total$hex[8]
    }else if (x$L[i] > Total$L[9]-Total$SDL[9] & x$L[i] < Total$L[9]+Total$SDL[9]){
        x$hex[i] <- Total$hex[9]
    }else if (x$L[i] > Total$L[10]-Total$SDL[10] & x$L[i] < Total$L[10]+Total$SDL[10]){
        x$hex[i] <- Total$hex[10]
    }else if (x$L[i] > Total$L[11]-Total$SDL[11] & x$L[i] < Total$L[11]+Total$SDL[11]){
        x$hex[i] <- Total$hex[11]
    }else if (x$L[i] > Total$L[12]-Total$SDL[12] & x$L[i] < Total$L[12]+Total$SDL[12]){
        x$hex[i] <- Total$hex[12]
    }else if (x$L[i] > Total$L[13]-Total$SDL[13] & x$L[i] < Total$L[13]+Total$SDL[13]){
        x$hex[i] <- Total$hex[13]
    }else if (x$L[i] > Total$L[14]-Total$SDL[14] & x$L[i] < Total$L[14]+Total$SDL[14]){
        x$hex[i] <- Total$hex[14]
    }else if (x$L[i] > Total$L[15]-Total$SDL[15] & x$L[i] < Total$L[15]+Total$SDL[15]){
        x$hex[i] <- Total$hex[15]
    }else if (x$L[i] > Total$L[16]-Total$SDL[16] & x$L[i] < Total$L[16]+Total$SDL[16]){
        x$hex[i] <- Total$hex[16]
    }
}}

execute colortest(Trun) gives the result with the NA's:

Sample        Time     L     C    h      L1    a      b    DE    heihgtmm  hex
1 Sample 1 10:51:04 AM 57.61 4.56 219.98 57.61 -3.49 -2,93 36.52    53.10 <NA>
2 Sample 2 10:51:05 AM 57.16 4.17 226.13 57.16 -2.89 -3,01 36.95    67.01 <NA>
3 Sample 3 10:51:06 AM 53.96 5.14 233.39 53.96 -3.06 -4,13 40.24    80.16 <NA>
4 Sample 4 10:51:07 AM 57.30 3.90 221.78 57.30 -2.91  -2,6 36.78    85.30 <NA>
5 Sample 5 10:51:08 AM 55.27 3.63 213.56 55.27 -3.03 -2,01 38.77    86.37 <NA>
6 Sample 6 10:51:09 AM 57.90 3.47 214.16 57.90 -2.87 -1,95 36.13    92.36 <NA>

What must I change in the function to make the if lines work just like the individual example?

Aucun commentaire:

Enregistrer un commentaire