【问题标题】:Split a dataframe and subset and plot it with loop拆分数据框和子集并用循环绘制它
【发布时间】:2014-05-13 10:13:38
【问题描述】:

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

逻辑:

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

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

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

*3a) 在此示例中,行 $Name= BD22 不能包含在 BD13 数据帧中,因为 $Position 超出窗口编号(5000 到 3000 的窗口从 $Position = 500 到 $Position 有所不同= 5500)

下面是一个简化的例子:

我的输入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()}

但是Neigh1Neigh2 是空的... 谢谢!

【问题讨论】:

    标签: r loops plot subset chr


    【解决方案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] 是包含resith 元素的列表(长度为1),而res[[i]]ith 元素本身。

    【讨论】:

    • 您好,我正在尝试创建一个循环,但出现错误:for (i in 1:length(res)) { pdf(sprintf("%s.pdf", res[i])) boxplot(res[i]$Name, res[i]$FC, xlab=res[i]$Name, ylab="FC", main=res[i]$Name) dev.off()} ##Error in plot.window(...) : 需要有限的“xlim”值知道吗?跨度>
    • 查看对我的原始代码的更正,以及用于绘图的其他行。
    • 没关系。问题是在我的情节中,轴上出现的都是input$Names,我只想要res[[i]]$Names,有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2021-10-13
    • 2015-02-26
    相关资源
    最近更新 更多