Skip to content

Repeat

6 messages · David Winsemius, Ashta

#
I have a data set and I want to repeat a column value based on other
column value,

my data look like

read.table(text = "Year month flag
2001 1   Z
2001 2   -
2001 4   X
2002 1   Z
2002 2   -
2003 1   -
2003 2   Z
2004 2   Z
2005 3   Z
2005 2   -
2005 3   -",  header = TRUE)

Within year If  flag = '-'  then i want replace  '-'  by the previous
row value of flag. In this example  for yea  2001 in month 2 flag is
'-' and I want replace it by the previous value of flag (i.e.,  'Z')
2001 1   Z
2001 2   Z
2001 4   X

If all values of flag  are '-' within year  then  I wan to set as N

The complete out put result will be

year month  flag
2001 1       Z
2001 2       z
2001 4       X
2002 1       Z
2002 2       Z
2003 1       Z
2003 2       Z
2004 2       Z
2005 3       Z
2005 2       N
2005 3       N

Thank you in advance
#
Your example doesn't actually match your verbal description of the algorithm because you have not specified the rule that establishes values for instances where the first value in a year is "-".

The `na.locf` function in the 'zoo' package would be useful for the task describe in your verbal description when used in conjunction with the 'stats'-package's `ave` function.
#
Thank you David.
is it not possible to sort it by year and flag so that we can make '-'
 in the second row ?  like this for that particular year.

   2003 2     Z
   2003 1      -



On Sat, Feb 25, 2017 at 12:14 PM, David Winsemius
<dwinsemius at comcast.net> wrote:
#
I was a bit surprised by the results of htis since I had assumed than an initial NA in a group would remain so, but apparently not:

dat$new <- with(dat, ave(flag, Year, FUN=function(s){ s[s=="-"] <- NA; zoo::na.locf(s) }) )
Year month flag new
1  2001     1    Z   Z
2  2001     2    -   Z
3  2001     4    X   X
4  2002     1    Z   Z
5  2002     2    -   Z
6  2003     1    -   Z
7  2003     2    Z   Z
8  2004     2    Z   Z
9  2005     3    Z   Z
10 2005     2    -   Z
11 2005     3    -   Z

David.
David Winsemius
Alameda, CA, USA
#
Thank you so much David!

But if all element of a group has '-'  did not work. In this case year
2006 an example
If all values of flag  are '-' within year  then  I wan to set as N


dat=read.table(text = "Year month flag
2001 1   Z
2001 2   -
2001 4   X
2002 1   Z
2002 2   -
2003 1   -
2003 2   Z
2004 2   Z
2005 3   Z
2005 2   -
2005 3   -

2006 1   -
2006 2   - ",  header = TRUE)

dat$new <- with(dat, ave(flag, Year, FUN=function(s){ s[s=="-"] <- NA;
           zoo::na.locf(s) }) )

Error in `[<-.factor`(`*tmp*`, i, value = integer(0)) :
  replacement has length zero
On Sat, Feb 25, 2017 at 5:43 PM, David Winsemius <dwinsemius at comcast.net> wrote:
#
I don't see the difficulty (and your example did not provide a suitable platform for demonstration.)  Set the remaining dashes to "N".