[R] Loop over factor returns NA

Mikkel Grum mi2kelgrum at yahoo.com
Mon Oct 14 01:15:26 CEST 2013

You'll need to tell us what class you time variable is in, e.g. the output of str(AB), but the following might work: for (i in unique(as.character(AB$time)) {
Intervall <- AB[as.character(AB$time) ==i, ]
} Depending on the format, as.numeric( ) might work too. Regards

On Saturday, October 12, 2013 12:16 PM, anna berg <anna.berg1986 at hotmail.com> wrote:
Dear R users,

I am pretty new to programming in R. So I guess there is some obvious mistake I am making. I hope you can help me.
I have a data frame that looks like this:

>  AB
        time        x        y       z         gene       part
1   03:27:58     1       2        3        grom         1
2   03:27:58     2       3        4        grom         1
3   03:27:58     3       4        5        grom         1
4   04:44:23    12      13      14      grom         2
5   04:44:23    13      14      15      grom         2
6   04:44:23    14      15      16      grom         2
7   04:44:23    15      16      17      grom         2
8   06:23:45   101     102    103    vir             3
9   06:23:45   102     103    104    vir             3
10 06:23:45   103     104    105    vir             3

Now I want to apply a loop (here a simplified version; I know that I could do this easily with tapply, but for the other things that I want to do with the loop (e.g. weighted mean of time series after fast fourier transformation) I would rather like to use a loop). 
Note that "time" and "part" are actually the same, just one is a factor and the the other is a number.
Here is the loop that works fine and returns the result as I want (the important part here is: Intervall <- AB[AB$part==i,]):

for(i in 1:length(unique(AB$time)))  
    Intervall <- AB[AB$part==i,]
    # Standart deviation
    sdx  <-sd(x)
    sdy  <-sd(y)
    sdz  <-sd(z)
    # Add Behavior
     gene <- as.character(Intervall[1,5])
    # Construct a table
      tab <-c(sdx, sdy, sdz, gene)
      write(tab, file=paste("VariableTable.txt", sep=""),
               ncolumns=4,sep=",", append=TRUE)
}  # end of for loop

The result looks like this and is fine:


My problem is, that I used the "part" column only to run the loop, but I actually want to use the time column to run the loop. But when I replace 

Intervall <- AB[AB$part==i,]
Intervall <- AB[AB$time==i,]

then the resulting table only contains NA.

I also tried to use Intervall <- AB[x==i,]

x <- as.factor(AB$part) --> which works fine as well
x <- as.factor(AB$time) --> which returns only NA 
x <- unique(AB$time) ---> which returns only NA
x <- levels(unique(AB$time) --> which returns only NA
x <- seq(unique(AB$time) ---> which returns the standard deviation of the entire column (not the single parts) 

What do I do wrong? And how can i fix it?

Thank you so much in advance.

Kind regards,

    [[alternative HTML version deleted]]

R-help at r-project.org mailing list
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