Hi,
I'm trying to execute the same R code on multiple data frames listed in a
single directory. The code works fine if I use the code
(below) for each file. However, I have several files and it becomes
tedious to run each one, name it and then aggregate into a single
dataframe.
Name
0.0 1
21.15 2
2400.26 1
3222.14 2
name = read.table(file.choose(),header=F) # opening a data file
colnames(name)<-c("Time", "Behavior")
name = data.frame(name$Behavior, name$Time)
colnames(name)<-c("Behavior", "Time")
name<-name[name$Time < 3600, ];
x<-seq(0,3600, by = 60) # total time partition by time which is 60
if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else
{name<-rbind(name, c(1, 3600))}
if (((length(name$Behavior))) %% 2 != 0)
{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]}
q<-c()
for (y in (1: (length(name$Behavior))))
{
if (y %% 2 == 0) {next} else
{q<-c(q, (c(name$Time[y]:name$Time[y +1])))}
}
b<-table(cut(q,x))
sum(b)
So, I tried to nest a for loop within another(code
below). It solved the problem of selecting each data file. However, a
problem was incurred with the second loop. It gave back a crazy matrix.
setwd("/Users/deliashelton/Documents/Shelton
back-up 11:21/labs/ABL meetings/DS7 Flow/DS7.5/Observers/AA 7.5/AA
PND2/AA PND 2 22C")
a<- list.files()
xx<- c()
t<-seq(0,3600, by = 60)
for (i in a){
name<- read.table(i,header=F)
colnames(name)=c("Time", "Behavior")
name<- data.frame(name$Behavior, name$Time)
colnames(name)<-c("Behavior", "Time")
name<-name[name$Time < 3600, ]
if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else
{name<-rbind(name, c(1, 3600))}
if (((length(name$Behavior))) %% 2 != 0)
{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]}
#xx <- rbind(xx, name)
# total time partition by time which is 60
q<-c()
for (y in (1: (length(name$Behavior))))
{
if (y %% 2 == 0) {next} else
{q<-c(q, (c(name$Time[y]:name$Time[y +1])))}
}
b<-table(cut(q,x))
xx <- rbind(xx, sum(b))
print(xx)
}
Crazy matrix:
[,1]
[1,] 4947
[,1]
[1,] 4947
[2,] 7318
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[12,] 31672
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[12,] 31672
[13,] 35268
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[12,] 31672
[13,] 35268
[14,] 38440
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[12,] 31672
[13,] 35268
[14,] 38440
[15,] 41796
[,1]
[1,] 4947
[2,] 7318
[3,] 8598
[4,] 9617
[5,] 11755
[6,] 13762
[7,] 17363
[8,] 19857
[9,] 23372
[10,] 25509
[11,] 28071
[12,] 31672
[13,] 35268
[14,] 38440
[15,] 41796
[16,] 43142
What I would like is for a recursive function/loop that
follows the initial codes computation, but does it for all data files in the
directory and binds the outputs into a single vector. If you have
any tips on getting the code to work or can help identify the problem,
your assistance would be appreciated.
[[alternative HTML version deleted]]
In what way doesn't this work? You declare xx with one element and it prints. Then on the next loop, you add another element, and it prints them both. Then on the next loop, you add another element, and it prints all three. And so on... If you look at the output, you can see that it's a growing vector. Perhaps you just mean to put print(xx) outside the loop to only get the single final answer. Michael PS -- Those are multiple matrices, not just a single "crazy matrix." On Tue, Oct 25, 2011 at 8:19 AM, Delia Shelton <delsshel at indiana.edu> wrote:> Hi, > > I'm trying to execute the same R code on multiple data frames listed in a single directory. The code works fine if I use the code > (below) for each file. However, I have several files and it becomes > tedious to run each one, name it and then aggregate into a single > dataframe. > > Name > 0.0 ? ? ? ? ? 1 > 21.15 ? ? ? 2 > 2400.26 ? 1 > 3222.14 ? 2 > > > name = read.table(file.choose(),header=F) # opening a data file > colnames(name)<-c("Time", "Behavior") > name = data.frame(name$Behavior, name$Time) > colnames(name)<-c("Behavior", "Time") > name<-name[name$Time < 3600, ]; > > > x<-seq(0,3600, by = 60) # total time partition by time which is 60 > > if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else > {name<-rbind(name, c(1, 3600))} > > if (((length(name$Behavior))) %% 2 != 0) > ?{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]} > > q<-c() > for (y in (1: (length(name$Behavior)))) > { > ? ? ? ? if (y %% 2 == 0) {next} else > ? ? ? ? {q<-c(q, (c(name$Time[y]:name$Time[y +1])))} > } > > b<-table(cut(q,x)) > > sum(b) > > > So, I tried to nest a for loop within another(code > below). It solved the problem of selecting each data file. However, a > problem was incurred with the second loop. It gave back a crazy matrix. > > setwd("/Users/deliashelton/Documents/Shelton > ?back-up 11:21/labs/ABL meetings/DS7 Flow/DS7.5/Observers/AA 7.5/AA > PND2/AA PND 2 22C") > > a<- list.files() > xx<- c() > t<-seq(0,3600, by = 60) > > for (i in a){ > ? ? ? ? name<- read.table(i,header=F) > ? ? ? ? colnames(name)=c("Time", "Behavior") > ? ? ? ? name<- data.frame(name$Behavior, name$Time) > ? ? ? ? colnames(name)<-c("Behavior", "Time") > ? ? ? ? name<-name[name$Time < 3600, ] > > ? ? ? ? if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else > {name<-rbind(name, c(1, 3600))} > > if (((length(name$Behavior))) %% 2 != 0) > ?{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]} > > > #xx <- rbind(xx, name) > > ?# total time partition by time which is 60 > > > ? ? ? ? q<-c() > ? ? ? ? for (y in (1: (length(name$Behavior)))) > ? ? ? ? { > ? ? ? ? ? ? ? ? if (y %% 2 == 0) {next} else > ? ? ? ? ? ? ? ? {q<-c(q, (c(name$Time[y]:name$Time[y +1])))} > > > ? ? ? ? ? ? ? ? ? ? ? ? } > > ? ? ? ? b<-table(cut(q,x)) > ? ? ? ? xx <- rbind(xx, sum(b)) > > ? ? ? ? print(xx) > } > > Crazy matrix: > > ?[,1] > [1,] 4947 > ? ? ?[,1] > [1,] 4947 > [2,] 7318 > ? ? ?[,1] > [1,] 4947 > [2,] 7318 > [3,] 8598 > ? ? ?[,1] > [1,] 4947 > [2,] 7318 > [3,] 8598 > [4,] 9617 > ? ? ? [,1] > [1,] ?4947 > [2,] ?7318 > [3,] ?8598 > [4,] ?9617 > [5,] 11755 > ? ? ? [,1] > [1,] ?4947 > [2,] ?7318 > [3,] ?8598 > [4,] ?9617 > [5,] 11755 > [6,] 13762 > ? ? ? [,1] > [1,] ?4947 > [2,] ?7318 > [3,] ?8598 > [4,] ?9617 > [5,] 11755 > [6,] 13762 > [7,] 17363 > ? ? ? [,1] > [1,] ?4947 > [2,] ?7318 > [3,] ?8598 > [4,] ?9617 > [5,] 11755 > [6,] 13762 > [7,] 17363 > [8,] 19857 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > [12,] 31672 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > [12,] 31672 > [13,] 35268 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > [12,] 31672 > [13,] 35268 > [14,] 38440 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > [12,] 31672 > [13,] 35268 > [14,] 38440 > [15,] 41796 > ? ? ? ?[,1] > ?[1,] ?4947 > ?[2,] ?7318 > ?[3,] ?8598 > ?[4,] ?9617 > ?[5,] 11755 > ?[6,] 13762 > ?[7,] 17363 > ?[8,] 19857 > ?[9,] 23372 > [10,] 25509 > [11,] 28071 > [12,] 31672 > [13,] 35268 > [14,] 38440 > [15,] 41796 > [16,] 43142 > > > What I would like is for a recursive function/loop that > follows the initial codes computation, but does it for all data files in the directory and binds the outputs into a single vector. If you have > any tips on getting the code to work or can help identify the problem, > your assistance would be appreciated. > ? ? ? ?[[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. > >
Hi there,
I'm adding a very small bit of something utterly useless to Michael's
response. When you start wondering why your code doesn't work the way
you expect, making it as simple as possible might be the first step.
For example, the following piece of code ...
TRUE
... is simpler than ...
!!!!TRUE
... and this, in turn, is simpler than ...
!(!(!(!(TRUE))))
... but they all result in the same value.
A couple of ideas how to make your code easier to read:
if (((length(name$Behavior))) %% 2 != 0) { something }
Here you have an extra pair of parentheses that could just as well be deleted:
if ((length(name$Behavior)) %% 2 != 0) { something }
But length() of a variable in a data frame is just nrow() of that data
frame so you could simplify this further to ...
if (nrow(name) %% 2 != 0) { something }
And this one ...
if (y %% 2 == 0) {next} else
{q<-c(q, (c(name$Time[y]:name$Time[y +1])))}
... is particularly tough considering that you might just as well write
if (y %% 2 != 0) q<-c(q, name$Time[y]:name$Time[y +1])
... or, if you like them a lot, ...
if ((((y))) %% (((2))) == (((0)))) {next} else
{q<-c((((q))), (c((((name$Time[y]))):(((name$Time[y
+(((1)))]))))))}
... would also do with some extra aesthetic pleasure.
> name = read.table(file.choose(),header=F) # opening a data file
> colnames(name)<-c("Time", "Behavior")
> name = data.frame(name$Behavior, name$Time)
> colnames(name)<-c("Behavior", "Time")
> name<-name[name$Time < 3600, ];
I don't get it. The result of read.table is a data frame, so you may
use names instead of colnames, and the 3rd and 4th lines seem to be
unnecessary. If you just want to switch the first and the second
variable, then X[,2:1] would do it. So instead of that you could
write:
X <- read.table(file.choose(),header=FALSE)[,2:1] # the name
"name"
sounds confusing
names(X) <- c("Behavior", "Time")
X <- subset(X, Time < 3600)
... (the following single line would also do but is uglier)
X <- subset(structure(read.table(file.choose(), header=FALSE)[,2:1],
.Names=c("Behavior", "Time")), Time < 3600)
And it may help giving your objects some meaningful names. For example,
a <- list.files()
is fine but alternative (and some might say, better understandable at
first look) names to `a` could be, e.g., `files` or `MYFILES` or
`list.of.files`. And ....
name<- read.table(i,header=F)
... again, you may name anything in whatever way but to call a data
table a `name` may be confusing to some readers. And saying that
xx<- c()
... is just another way of saying that xx <- NULL . NULL is clearer
than c() as it makes your intention (to make an empty object and then
start adding something to it) more obvious. Besides, NULL is quicker
and more efficient.
Sorry for not giving any useful advice, it's late here.
Best regards,
Kenn Konstabel
On Tue, Oct 25, 2011 at 3:19 PM, Delia Shelton <delsshel at indiana.edu>
wrote:> Hi,
>
> I'm trying to execute the same R code on multiple data frames listed in
a single directory. The code works fine if I use the code
> (below) for each file. However, I have several files and it becomes
> tedious to run each one, name it and then aggregate into a single
> dataframe.
>
> Name
> 0.0 ? ? ? ? ? 1
> 21.15 ? ? ? 2
> 2400.26 ? 1
> 3222.14 ? 2
>
>
> name = read.table(file.choose(),header=F) # opening a data file
> colnames(name)<-c("Time", "Behavior")
> name = data.frame(name$Behavior, name$Time)
> colnames(name)<-c("Behavior", "Time")
> name<-name[name$Time < 3600, ];
>
>
> x<-seq(0,3600, by = 60) # total time partition by time which is 60
>
> if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))} else
> {name<-rbind(name, c(1, 3600))}
>
> if (((length(name$Behavior))) %% 2 != 0)
> ?{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]}
>
> q<-c()
> for (y in (1: (length(name$Behavior))))
> {
> ? ? ? ? if (y %% 2 == 0) {next} else
> ? ? ? ? {q<-c(q, (c(name$Time[y]:name$Time[y +1])))}
> }
>
> b<-table(cut(q,x))
>
> sum(b)
>
>
> So, I tried to nest a for loop within another(code
> below). It solved the problem of selecting each data file. However, a
> problem was incurred with the second loop. It gave back a crazy matrix.
>
> setwd("/Users/deliashelton/Documents/Shelton
> ?back-up 11:21/labs/ABL meetings/DS7 Flow/DS7.5/Observers/AA 7.5/AA
> PND2/AA PND 2 22C")
>
> a<- list.files()
> xx<- c()
> t<-seq(0,3600, by = 60)
>
> for (i in a){
> ? ? ? ? name<- read.table(i,header=F)
> ? ? ? ? colnames(name)=c("Time", "Behavior")
> ? ? ? ? name<- data.frame(name$Behavior, name$Time)
> ? ? ? ? colnames(name)<-c("Behavior", "Time")
> ? ? ? ? name<-name[name$Time < 3600, ]
>
> ? ? ? ? if (tail(name$Behavior, 1) == 1) {name<-rbind(name, c(4, 3600))}
else
> {name<-rbind(name, c(1, 3600))}
>
> if (((length(name$Behavior))) %% 2 != 0)
> ?{name <-name[-c(length(name$Behavior)), -c(length(name$Behavior))]}
>
>
> #xx <- rbind(xx, name)
>
> ?# total time partition by time which is 60
>
>
> ? ? ? ? q<-c()
> ? ? ? ? for (y in (1: (length(name$Behavior))))
> ? ? ? ? {
> ? ? ? ? ? ? ? ? if (y %% 2 == 0) {next} else
> ? ? ? ? ? ? ? ? {q<-c(q, (c(name$Time[y]:name$Time[y +1])))}
>
>
> ? ? ? ? ? ? ? ? ? ? ? ? }
>
> ? ? ? ? b<-table(cut(q,x))
> ? ? ? ? xx <- rbind(xx, sum(b))
>
> ? ? ? ? print(xx)
> }
>
> Crazy matrix:
>
> ?[,1]
> [1,] 4947
> ? ? ?[,1]
> [1,] 4947
> [2,] 7318
> ? ? ?[,1]
> [1,] 4947
> [2,] 7318
> [3,] 8598
> ? ? ?[,1]
> [1,] 4947
> [2,] 7318
> [3,] 8598
> [4,] 9617
> ? ? ? [,1]
> [1,] ?4947
> [2,] ?7318
> [3,] ?8598
> [4,] ?9617
> [5,] 11755
> ? ? ? [,1]
> [1,] ?4947
> [2,] ?7318
> [3,] ?8598
> [4,] ?9617
> [5,] 11755
> [6,] 13762
> ? ? ? [,1]
> [1,] ?4947
> [2,] ?7318
> [3,] ?8598
> [4,] ?9617
> [5,] 11755
> [6,] 13762
> [7,] 17363
> ? ? ? [,1]
> [1,] ?4947
> [2,] ?7318
> [3,] ?8598
> [4,] ?9617
> [5,] 11755
> [6,] 13762
> [7,] 17363
> [8,] 19857
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> [12,] 31672
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> [12,] 31672
> [13,] 35268
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> [12,] 31672
> [13,] 35268
> [14,] 38440
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> [12,] 31672
> [13,] 35268
> [14,] 38440
> [15,] 41796
> ? ? ? ?[,1]
> ?[1,] ?4947
> ?[2,] ?7318
> ?[3,] ?8598
> ?[4,] ?9617
> ?[5,] 11755
> ?[6,] 13762
> ?[7,] 17363
> ?[8,] 19857
> ?[9,] 23372
> [10,] 25509
> [11,] 28071
> [12,] 31672
> [13,] 35268
> [14,] 38440
> [15,] 41796
> [16,] 43142
>
>
> What I would like is for a recursive function/loop that
> follows the initial codes computation, but does it for all data files in
the directory and binds the outputs into a single vector. If you have
> any tips on getting the code to work or can help identify the problem,
> your assistance would be appreciated.
> ? ? ? ?[[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.
>
>