On 10/13/2013 02:12 AM, anna berg 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,]
     attach(Intervall)
     # 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)
     detach(Intervall)
  }  # end of for loop

The result looks like this and is fine:

1,1,1,grom
1.3,1.3,1.3,grom
1,1,1,vir

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,]
with
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)

Hi Anna,
If "time" is a factor, then perhaps:

for(i in unique(AB$time)) {
...

this should also work if "time" is a character vector. I would look at:

unique(AB$time)

to see what is there.

Jim

______________________________________________
R-help@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.

Reply via email to