0
votes

I know there must be a simple way in R to iterate this process in a For loop, but I am pretty new at writing loops. Here is the process that I would like to accomplish with a loop

sfus1a<-ddply(sfus,.(Phylum),nrow);sfus1a[1,1]
sfus1b<-subset(sfus,sfus$Phylum==sfus1a[1,1])
sfus1<-ddply(sfus1b,.(Genus),nrow);sfus1

sfus1a<-ddply(sfus,.(Phylum),nrow);sfus1a[2,1]
sfus1b<-subset(sfus,sfus$Phylum==sfus1a[2,1])
sfus2<-ddply(sfus1b,.(Genus),nrow);sfus2

sfus1a<-ddply(sfus,.(Phylum),nrow);sfus1a[3,1]
sfus1b<-subset(sfus,sfus$Phylum==sfus1a[3,1])
sfus3<-ddply(sfus1b,.(Genus),nrow);sfus3

sfus1a<-ddply(sfus,.(Phylum),nrow);sfus1a[4,1]
sfus1b<-subset(sfus,sfus$Phylum==sfus1a[4,1])
sfus4<-ddply(sfus1b,.(Genus),nrow);sfus4

so the output should be four dataframes sfus1, sfus2, sfus3, and sfus4

The following loop that I attempted to write does not work

for(i in 1:4){
  sfus1a<-ddply(sfus,.(Phylum),nrow);sfus1a[i,1]
  sfus1b<-subset(sfus,sfus$Phylum==sfus1a[i,1])
  sfusi<-ddply(sfus1b,.(Genus),nrow);sfusi
}
1

1 Answers

2
votes

Create a list first otherwise the for loop will overwrite the variable each iteration

# pre-allocate lists
sfus1a <- vector(mode = "list", length = nrow(sfus))
sfus1b <- vector(mode = "list", length = nrow(sfus))
sfusi <- vector(mode = "list", length = nrow(sfus))

for(i in 1:4){
  sfus1a[i] <- ddply(sfus, .(Phylum), nrow)
  sfus1b[i] <- subset(sfus, sfus$Phylum == sfus1a[i, 1])
  sfusi[i] <- ddply(sfus1b, .(Genus), nrow)
}

This might need some slight tweaking as there wasn't a sample data set to test against