Hi
I have not seen any answer yet so I wil try (partly).
I believe that the loop can be vectorised but I am a little bit lost
in your fors and ifs. I found that first part of res is same as
cumsum(tab$x.jour) until about 81st value. However I did not decipher
how to compute the remaining part. I tried to add
cumsum(tab$posit.lat) (after changing NA to 0) what is not correct.
Probably some combination of logical operation and summing can do
what you want. I thought that something like
((cumsum(tab$posit.lat)*0.8)*(cumsum(tab$x.jour)>30)+cumsum(tab$x.jour
))
can do it but the result is defferent from your computation.
Not much of help, but maybe you can do better with above suggestion.
Petr
On 2 Nov 2006 at 11:15, GOUACHE David wrote:
Date sent: Thu, 2 Nov 2006 11:15:49 +0100
From: "GOUACHE David" <D.GOUACHE at
arvalisinstitutduvegetal.fr>
To: <r-help at stat.math.ethz.ch>
Subject: [R] avoiding a loop: "cumsum-like"
> Hello Rhelpers,
>
> I need to run the following loop over a large number of data-sets, and
> was wondering if it could somehow be vectorized. It's more or less a
> cumulative sum, but slightly more complex. Here's the code, and an
> example dataset (called tab in my code) follows. Thanks in advance for
> any suggestions!
>
> res<-0
> for (i in min(tab$Date):max(tab$Date))
> {
> if (is.na(tab$posit.lat[tab$Date==i])==T)
> {
> res<-c(res,res[length(res)]+tab$x.jour[tab$Date==i])
> }
> else
> {
> if (res[tab$posit.lat[tab$Date==i]+1]<30)
> {
> res<-c(res,res[length(res)]+tab$x.jour[tab$Date==i])
> }
> else
> {
> res<-c(res,res[length(res)]+tab$x.jour[tab$Date==i]+0.8*res[tab$pos
> it.lat[tab$Date==i]+1])
> }
> }
> }
> res[-1]
>
>
> Date x.jour posit.lat
> 35804 0 NA
> 35805 0 NA
> 35806 0 NA
> 35807 0 NA
> 35808 0 NA
> 35809 2.97338883 NA
> 35810 2.796389915 NA
> 35811 0 NA
> 35812 0 NA
> 35813 1.000711886 NA
> 35814 0.894422571 NA
> 35815 0 NA
> 35816 0 NA
> 35817 0 NA
> 35818 0 NA
> 35819 0 NA
> 35820 0 NA
> 35821 0 NA
> 35822 0 NA
> 35823 0 NA
> 35824 0 NA
> 35825 0 NA
> 35826 0 NA
> 35827 0 NA
> 35828 0 NA
> 35829 0 NA
> 35830 0 NA
> 35831 0 NA
> 35832 0 NA
> 35833 0 NA
> 35834 0 NA
> 35835 0 NA
> 35836 0 NA
> 35837 0 NA
> 35838 0 NA
> 35839 0 NA
> 35840 2.47237455 NA
> 35841 0 2
> 35842 0 3
> 35843 0 4
> 35844 0 5
> 35845 0 6
> 35846 0 7
> 35847 4.842160488 8
> 35848 2.432125036 9
> 35849 0 10
> 35850 0 12
> 35851 0 14
> 35852 0 16
> 35853 3.739683882 18
> 35854 1.980214421 20
> 35855 0 22
> 35856 0 24
> 35857 5.953444078 27
> 35858 6.455722475 29
> 35859 0 31
> 35860 3.798690334 32
> 35861 6.222993364 34
> 35862 3.746243098 35
> 35863 0 35
> 35864 0 36
> 35865 0 37
> 35866 0 38
> 35867 0 38
> 35868 0 39
> 35869 0 40
> 35870 0 41
> 35871 0 42
> 35872 0 43
> 35873 0 44
> 35874 0 45
> 35875 0 46
> 35876 0 47
> 35877 1.951774892 48
> 35878 0 49
> 35879 0 50
> 35880 1.702837643 50
> 35881 0 52
> 35882 0 53
> 35883 0 54
> 35884 0 55
> 35885 5.953444078 57
> 35886 0 58
> 35887 5.737515358 59
> 35888 0 61
> 35889 6.215941227 63
> 35890 4.731576675 64
> 35891 0 66
> 35892 2.255448314 66
> 35893 3.782283008 67
> 35894 3.244474546 68
> 35895 1.808553193 69
> 35896 2.622680002 70
> 35897 0 71
> 35898 0 72
> 35899 0 72
> 35900 1.7084177 73
> 35901 1.28455982 74
> 35902 2.320013736 76
> 35903 0 77
> 35904 0 78
> 35905 0 79
> 35906 0 79
> 35907 0 80
> 35908 6.716812458 81
> 35909 0 82
> 35910 6.796571531 84
> 35911 5.573668337 85
> 35912 5.42513958 86
> 35913 3.774513877 86
> 35914 0 87
> 35915 0 89
> 35916 0 90
> 35917 4.208252725 91
> 35918 0 92
> 35919 0 93
> 35920 0 95
> 35921 5.70023661 97
> 35922 0 98
> 35923 0 100
> 35924 0 102
> 35925 0 103
> 35926 0 104
>
> David Gouache
> Arvalis - Institut du V?g?tal
> Station de La Mini?re
> 78280 Guyancourt
> Tel: 01.30.12.96.22 / Port: 06.86.08.94.32
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html and provide commented,
> minimal, self-contained, reproducible code.
Petr Pikal
petr.pikal at precheza.cz