R循环数据框和绘图

时间:2014-05-23 07:09:15

标签: r

我问的问题可能是之前提出过的。但是,我无法找到可以根据我的数据调整的答案。

我的数据示例:

State  V1         V2       V3  
2   0.00000     0.0000   12.2661
4   0.00000     0.0000   21.3610
3   2.15633     0.0000    0.0000
3  28.07880    33.0049   30.7882
2   0.00000     0.0000    0.0000
6   0.00000     7.3000   33.6100
2   1.00000     0.0000   10.2503
4   0.00000     5.0000   56.3410
3   2.15633     0.0000    0.0000
6   8.07880    43.0049   15.8002
2   0.40000     0.0000    0.0000
2   0.00000     0.0000   23.1000

我想:对于每个State(2,3,4,6),每Variable(V1,V2,V3)进行绘图。

我能够想要使用此代码:

s2 <- subset(df, State == 2)
s3 <- subset(df, State == 3)
s4 <- subset(df, State == 4)
s6 <- subset(df, State == 6) 

jpeg('rplot_V1.jpg')
boxplot(s2$V1,s3$V1,s4$V1,s6$V1)  
dev.off()
jpeg('rplot_V2.jpg')
boxplot(s2$V2,s3$V2,s4$V2,s6$V2)  
dev.off()
jpeg('rplot_V3.jpg')
boxplot(s2$V3,s3$V3,s4$V3,s6$V3)  
dev.off()

当数据帧大10倍时,这种解决方案很笨拙 我的问题:如何循环数据框并打印?

2 个答案:

答案 0 :(得分:1)

我认为这就是你的目标

states <- unique(test$State)           #if your data.frame is called `test`

for(i in 1:length(states)){
  boxplot(test[test$State == states[i],2:4])  
}

OP评论后编辑

如果要绘制状态1,2和&gt; = 3,可以通过临时创建另一个data.frame(tmp)并操纵State值来轻松完成。然后你可以使用与上述相同的循环。

tmp <- test

tmp$State[tmp$State >= 3] <- 3

states <- unique(tmp$State)

for(i in 1:length(states)){
  boxplot(test[test$State == states[i],2:4])
}

答案 1 :(得分:1)

试试这个:

#dummy data
df <- read.table(text="State  V1         V2       V3  
2   0.00000     0.0000   12.2661
4   0.00000     0.0000   21.3610
3   2.15633     0.0000    0.0000
3  28.07880    33.0049   30.7882
2   0.00000     0.0000    0.0000
6   0.00000     7.3000   33.6100
2   1.00000     0.0000   10.2503
4   0.00000     5.0000   56.3410
3   2.15633     0.0000    0.0000
6   8.07880    43.0049   15.8002
2   0.40000     0.0000    0.0000
2   0.00000     0.0000   23.1000", header=TRUE,as.is=TRUE)

#plot boxplot
lapply(2:ncol(df),function(i){
  jpeg(paste0(paste("State",colnames(df)[i],sep="~"),".jpeg"))
  boxplot(df[,i]~df$State,
          ylab="State",
          xlab=colnames(df)[i],
          main=paste("State",colnames(df)[i],sep="~"))
  dev.off()
  })