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:> ABtime 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) What do I do wrong? And how can i fix it? Thank you so much in advance. Kind regards, Anna [[alternative HTML version deleted]]
Hi,
Not sure if you have any restrictions in using ?lapply().
AB <- read.table(text="
????? 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",sep="",header=TRUE,stringsAsFactors=FALSE)?
str(AB)
#'data.frame':??? 10 obs. of? 6 variables:
# $ time: chr? "03:27:58" "03:27:58" "03:27:58"
"04:44:23" ...
# $ x?? : int? 1 2 3 12 13 14 15 101 102 103
# $ y?? : int? 2 3 4 13 14 15 16 102 103 104
# $ z?? : int? 3 4 5 14 15 16 17 103 104 105
# $ gene: chr? "grom" "grom" "grom"
"grom" ...
# $ part: int? 1 1 1 2 2 2 2 3 3 3
#It is not clear from the example whether you have multiple 'gene` within
'part' or 'time'.
res1 <- do.call(rbind,lapply(split(AB,AB$part),function(u) {
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
??? sdx<- sd(u$x)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
????sdy<- sd(u$y)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
????sdz <- sd(u$z)
???? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? tab<-
data.frame(sdx,sdy,sdz,gene=u$gene[1],stringsAsFactors=FALSE)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? }))
#Similarly for time
res2 <- do.call(rbind,lapply(split(AB,AB$time),function(u) {
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
??? sdx<- sd(u$x)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
????sdy<- sd(u$y)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ???
????sdz <- sd(u$z)
???? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? tab<-
data.frame(sdx,sdy,sdz,gene=u$gene[1],stringsAsFactors=FALSE)
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? }))
?str(res1)
#'data.frame':??? 3 obs. of? 4 variables:
# $ sdx : num? 1 1.29 1
# $ sdy : num? 1 1.29 1
# $ sdz : num? 1 1.29 1
# $ gene: chr? "grom" "grom" "vir"
#Use
?write.table()
A.K.
On Saturday, October 12, 2013 11:12 AM, 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,]
? ? 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)
What do I do wrong? And how can i fix it?
Thank you so much in advance.
Kind regards,
Anna
??? ??? ??? ? ??? ??? ?
??? [[alternative HTML version deleted]]
______________________________________________
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.
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
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
Mikkel
On Saturday, October 12, 2013 12:16 PM, anna berg
<anna.berg1986@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,]
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)
What do I do wrong? And how can i fix it?
Thank you so much in advance.
Kind regards,
Anna
[[alternative HTML version deleted]]
______________________________________________
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.
[[alternative HTML version deleted]]
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
Mikkel
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,]
? ? 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)
What do I do wrong? And how can i fix it?
Thank you so much in advance.
Kind regards,
Anna
??? ??? ??? ? ??? ??? ?
??? [[alternative HTML version deleted]]
______________________________________________
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.