[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