Santiago Guallar
2013-Jun-10 09:49 UTC
[R] modify and append new rows to a data.frame using ddply
Hi,
I have a data.frame that contains a variable act which records the duration (in
seconds) of two states (wet-dry) for several individuals (identified by Ring)
over a period of time. Since I want to work with daytime (i.e. from sunrise till
sunset) and night time (i.e. from sunset till next sunrise), I have to split act
from time[i] till sunset and from sunset until time[i+1], and from time[k] till
sunrise and from sunrise until time[k+1].
Here is an example with time and act separated by a comma:
[i] 01-01-2000 20:55:00 , 360?
[i+1] 01-01-2000 21:01:00 , 30 # let's say that sunset is at 01-01-2000
21:00:00
[i+2]?01-01-2000 21:01:30 , 30
.
.
.
My goal is to get:
[i]?01-01-2000 20:55:00 , 300 # act is modified
[i+1]?01-01-2000 21:00:00 , 60 # new row with time=sunset
[i+2]?01-01-2000 21:01:00 , 30 # previously row i+1th
[i+3]?01-01-2000 21:01:30 , 30 # previously row i+2th
.
.
.
I attach a dput with a selection of my data.frame. Here is a piece of existing
code that I am trying to adapt just for the daytime/night time change:
? require(plyr)
? xandaynight <- ddply( xan, .(Ring), function(df1){
? # index of day/night changes
? ind <- c( FALSE, diff(df$dif) == 1 )
? add <- df1[ind,]
? add$timepos <- add$dusk
? # rearrangement
? df1 <- rbind( df1, add )
? df1 <- df1[order(df1$timepos),]
? # recalculation of act
? df1$act2 <- c( diff( as.numeric(df1$timepos) ), NA )
? df1} )
This code produces an error message:
"Error en diff(df$dif): error in evaluating the argument 'x' in
selecting a method for function 'diff': Error en df$dif: object of type
'closure' is not a subset"
Thank you for your help,
Santi
Berend Hasselman
2013-Jun-10 10:07 UTC
[R] modify and append new rows to a data.frame using ddply
On 10-06-2013, at 11:49, Santiago Guallar <sguallar at yahoo.com> wrote:> Hi, > > I have a data.frame that contains a variable act which records the duration (in seconds) of two states (wet-dry) for several individuals (identified by Ring) over a period of time. Since I want to work with daytime (i.e. from sunrise till sunset) and night time (i.e. from sunset till next sunrise), I have to split act from time[i] till sunset and from sunset until time[i+1], and from time[k] till sunrise and from sunrise until time[k+1]. > > Here is an example with time and act separated by a comma: > > [i] 01-01-2000 20:55:00 , 360 > [i+1] 01-01-2000 21:01:00 , 30 # let's say that sunset is at 01-01-2000 21:00:00 > > [i+2] 01-01-2000 21:01:30 , 30 > > . > . > . > My goal is to get: > [i] 01-01-2000 20:55:00 , 300 # act is modified > > [i+1] 01-01-2000 21:00:00 , 60 # new row with time=sunset > > [i+2] 01-01-2000 21:01:00 , 30 # previously row i+1th > > [i+3] 01-01-2000 21:01:30 , 30 # previously row i+2th > > . > . > . > I attach a dput with a selection of my data.frame. Here is a piece of existing code that I am trying to adapt just for the daytime/night time change: > > require(plyr) > > xandaynight <- ddply( xan, .(Ring), function(df1){ > # index of day/night changes > ind <- c( FALSE, diff(df$dif) == 1 ) > add <- df1[ind,] > add$timepos <- add$dusk > # rearrangement > df1 <- rbind( df1, add ) > df1 <- df1[order(df1$timepos),] > # recalculation of act > df1$act2 <- c( diff( as.numeric(df1$timepos) ), NA ) > df1} ) > > This code produces an error message: > "Error en diff(df$dif): error in evaluating the argument 'x' in selecting a method for function 'diff': Error en df$dif: object of type 'closure' is not a subset" >Shouldn't the line ind <- c( FALSE, diff(df$dif) == 1 ) read ind <- c( FALSE, diff(df1$dif) == 1 ) Berend