2017-03-16 94 views
0

我知道R中必须有一个简单的方法来在For循环中迭代这个过程,但我在编写循环方面相当新颖。下面是我尝试写不工作,我想用一个循环for循环在每次迭代后输出一个唯一的数据帧

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 

完成所以输出应该有四个dataframes sfus1,sfus2,sfus3过程中,sfus4

下面的循环

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 
} 

回答

2

创建列表第一否则for循环将覆盖变量每个迭代

# 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) 
} 

这可能需要稍微调整,因为没有样本数据集要测试

相关问题