拆分数据框和子集并使用循环绘制它

时间:2014-05-13 10:13:38

标签: r loops plot subset chr

当我在某行中获取值时,我想在数据框中选择特定的行。这些选定行(加上初始选定行)必须组成新数据帧,并且数据框名称必须在初始选定行中为= $Name

逻辑:

1 - 初始选定的行必须$FC => 0.7。

2 - 形成数据框的选定行必须$chr =到初始选定行。

3 - 所选行在5000窗口内必须有$Position(与初始选定行中的$Position比较)。

* 3a)在此示例中,行$Name = BD22无法包含在BD13数据框中,因为$Position超出了窗口编号(自{{1 }} = 500直到$Position = 5500)

以上是一个简化的例子:

我的输入$Position数据框:

input

我希望有一个名称行作为输出的数据框,在本例中为 Name FC chr Position BD10 0.1 chr1 1000 BD11 0.1 chr2 1000 BD12 0.2 chr3 2000 BD13 0.7 chr3 3000 BD14 0.4 chr3 4000 BD22 0.1 chr3 7000 BD23 0.2 chr4 1000

BD13

之后,我想绘制每个组合数据帧:

Name   FC   chr   Position
BD12   0.2  chr3   2000
BD13   0.7  chr3   3000
BD14   0.4  chr3   4000

我试过了:

pdf(BD13.pdf)
plot(BD13$Name, BD13$FC, main="BD13",
   xlab="Name", ylab="FC")
dev.off()

但是out <- subset(input, FC >= 0.7) out$startw <- (out$Position - 2500) out$endw <- (out$Position + 2500) library(plyr) lvl <- dlply(out, .(Name)) for (i in 1:length(lvl)) { Neigh1 <- subset(input, input$Position >= lvl[i]$startw & lvl[i]$chr == input$chr) Neigh2 <- subset(input, input$Position <= lvl[i]$endw & lvl[i]$chr == input$chr) Neight <- rbind(Neigh1, Neigh2) pdf(sprintf("%s.pdf", [i])) boxplot(Neigh$Name, Neigh$FC, xlab=[i], ylab="FC", main="[i]") dev.off()} Neigh1是空的...... 谢谢!

1 个答案:

答案 0 :(得分:1)

除非你真的想要,否则根据input$name中的元素创建所有这些新的变量是一个坏主意,因为:

  • 如果input$name包含与之相冲突的名称,例如“输入” 另一个变量,你可以得到很难追查的错误

  • 您可能会使用许多变量使工作区混乱

  • 很难(呃)循环变量来绘制它们而不使用深奥的R代码,或复制和粘贴大量代码。

我建议按如下方式创建一个列表:

rows <- 1:nrow(input)
res <- lapply(which(input$FC>=0.7),function(x) {
           x2 <- rows 
           x2<- input$chr[x2] == input$chr[x] & abs(input$Position[x2] - input$Position[x]) < 2500
          input[x2,]})
names(res) <- input$Name[input$FC>=0.7]  ##corrected this line

其中列表的每个元素都是您要创建的变量之一。访问为res[["BD13"]]res[[1]] - 后一种形式可以轻松地在循环中生成所有绘图。

编辑:

为了绘图,我认为您需要以下内容(目前无法测试):

for (i in 1:length(res)) {   
  pdf(sprintf("%s.pdf", names(res)[i]))   
  boxplot(res[[i]]$Name, res[[i]]$FC, xlab=res[[i]]$Name, ylab="FC", main=names(res)[i])   
  dev.off()
} 

但检查boxplot的参数 - 我不认为第一个应该是文本

res[i]是一个包含i res元素的列表(长度为1),而res[[i]]i元素本身。< / p>