[R] Imposing more than one condition to if

Santiago Guallar sguallar at yahoo.com
Tue Jul 17 20:53:13 CEST 2012


Thank for your time, Rui.
 
Now, I get this error message:
Error en rbind(deparse.level, ...) : 
numbers of columns of arguments do not match
 
Apparently, some columns have missing values and rbind doesn't work. I tried:
require(plyr)
do.call(rbind.fill, by(z, z$date, f))
 
Then the code runs through but dusk the variable dusk is missing and dawn is filled with NA.
Just in case the problem simply lies in a name, this is your code after I changed the object names (basically 'x' and 'd' by 'z') to adapt them to the names of my dataset:
f <- function(z){
zrle <- rle(z$lig == 0)
if(zrle$values[1]){
idusk <- sum(zrle$lengths[1:2]) + 1
idawn <- zrle$lengths[1] + 1
z$dusk <- z$dtime[ idusk ]
z$dawn <- z$dtime[ idawn ]
}else{
idusk <- zrle$lengths[1] + 1
z$dusk <- z$dtime[ idusk ]
z$dawn <- NA
}
z
}

do.call(rbind, by(z, z$date, f))
 
Again, I attached a dput() with the object z which contains my dataset.
 
Santi

From: Rui Barradas <ruipbarradas at sapo.pt>
>To: Santiago Guallar <sguallar at yahoo.com> 
>Cc: r-help at r-project.org 
>Sent: Tuesday, July 17, 2012 11:52 AM
>Subject: Re: [R] Imposing more than one condition to if
>
>
>>Hello,
>>
>>My code couldn't find the right input columns because your real data has 
>>different names, it could only find the example dataset's names.
>>
>>And there's another problem, my code would give correct answers with a 
>>limted number of possible inputs and fail with real data.
>>
>>Corrected:
>>
>>
>>f <- function(x){
>>    zrle <- rle(x$lig == 0)
>>    if(zrle$values[1]){
>>        idusk <- sum(zrle$lengths[1:2]) + 1
>>        idawn <- zrle$lengths[1] + 1
>>        x$dusk <- x$dtime[ idusk ]
>>        x$dawn <- x$dtime[ idawn ]
>>    }else{
>>        idusk <- zrle$lengths[1] + 1
>>        x$dusk <- x$dtime[ idusk ]
>>        x$dawn <- NA
>>    }
>>    x
>>}
>>
>>do.call(rbind, by(d, d$date, f))
>>
>>
>>One more thing, you are reading your dataset into a data.frame 
>>forgetting that character strings become factors. Try str(d) to see it.
>>('d' is the data.frame.) You could/should coerce the date/time values to 
>>appropriate classes, something like
>>
>>
>>d$time <- as.character(d$time)
>>d$time <- as.POSIXct(d$time, format="%d/%m/%y %H:%M:%S")
>>d$date <- as.character(d$date)
>>d$date <- as.Date(d$date, format="%d/%m/%y")
>>
>>
>>Hope this helps,
>>
>>Rui Barradas
>>
>>Em 17-07-2012 07:14, Santiago Guallar escreveu:
>>> Thank you Rui,
>>>
>>> When applied to my original data, your code goes through although it
>>> does not produce the correct results: for dusk gives the first time
>>> value of next day, for dawn it gives NA. It seems that the function f
>>> doesn't find the right input columns.
>>> A, Ilso had to push up the memory size.
>>> Attached a file (containing just 3000 of the original c. 45000 rows)
>>> after dput().
>>>
>>> Santi
>>>
>>>
>>>    ------------------------------------------------------------------------
>>>    *From:* Rui Barradas <ruipbarradas at sapo.pt>
>>>    *To:* Santiago Guallar <sguallar at yahoo.com>
>>>    *Cc:* r-help at r-project.org
>>>    *Sent:* Sunday, July 15, 2012 7:21 PM
>>>    *Subject:* Re: [R] Imposing more than one condition to if
>>>
>>>    Hello,
>>>
>>>    There are obvious bugs in your code, you are testing for light > 2 or
>>>    ligth < 2 but this would mean that dusk and dawn are undetermined for
>>>    light == 2 and that they happen at light == 1.
>>>
>>>    Without loops or compound logical conditions:
>>>
>>>
>>>    f <- function(x){
>>>          x$dawn <- x$time[ which.min(x$light) ]
>>>          x$dusk <- x$time[ max(which(x$light == 0)) + 1 ]
>>>          x
>>>    }
>>>
>>>    do.call(rbind, by(d, d$day, f))
>>>
>>>    Hope this helps,
>>>
>>>    Rui Barradas
>>>
>>>    Em 15-07-2012 17:32, Santiago Guallar escreveu:
>>>      > Hi,
>>>      >
>>>      > I have a dataset which contains several time records for a number
>>>    of days, plus a variable (light) that allows to determine night time
>>>    (lihgt= 0) and daytime (light> 0). I need to obtain get dusk time
>>>    and dawn time for each day and place them in two columns.
>>>      >
>>>      > This is the starting point (d):
>>>      > day time light
>>>      > 1    1      20
>>>      > 1    12    10
>>>      > 1    11    6
>>>      > 1    9      0
>>>      > 1    6      0
>>>      > 1    12    0
>>>      > ...
>>>      > 30    8    0
>>>      > 30    3    0
>>>      > 30    8    0
>>>      > 30    3    0
>>>      > 30    8    8
>>>      > 30    9    20
>>>      >
>>>      >
>>>      > And this what I want to get:
>>>      > day time light dusk dawn
>>>      > 1    1      20    11    10
>>>      > 1    12    10    11    10
>>>      > 1    11    6      11    10
>>>      > 1    9      0      11  10
>>>      > 1    6      0      11    10
>>>      > 1    12    0      11    10
>>>      > ...
>>>      > 30    8    0      9    5
>>>      > 30    3    0      9    5
>>>      > 30    8    0      9    5
>>>      > 30    3    0      9    5
>>>      > 30    8    8      9    5
>>>      > 30    9    20    9    5
>>>      >
>>>      > This is the code for data frame d:
>>>      > day= rep(1:30, each=10)
>>>      > n= length(dia); x= c(1:24)
>>>      > time= sample(x, 300, replace= T)
>>>      > light= rep(c(20,10,6,0,0,0,0,0,8,20), 30)
>>>      > d=data.frame(day,time,light)
>>>      >
>>>      > I'd need to impose a double condition like the next but if does
>>>    not take more than one:
>>>      > attach(d)
>>>      > for (i in 1: n){
>>>      > if (light[i-1]>2 & light[i]<2){
>>>      > d$dusk<- time[i-1]
>>>      > }
>>>      > if (light[i-1]<2 & light[i]>2){
>>>      > d$dawn<- time[i]
>>>      > }
>>>      > }
>>>      > detach(d)
>>>      > d
>>>      >
>>>      > Thank you for your help
>>>      >    [[alternative HTML version deleted]]
>>>      >
>>>      >
>>>      >
>>>      > ______________________________________________
>>>      > R-help at r-project.org <mailto:R-help at r-project.org> 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.
>>>      >
>>>
>>>
>>>
>>
>>
>>
>>
>
>


More information about the R-help mailing list