【问题标题】:Error with parsing data in R在 R 中解析数据时出错
【发布时间】:2015-09-11 13:30:21
【问题描述】:

我已尝试编写以下代码以识别范围内的数字,即:SNP[i,1] 应小于 Working[j,1] 且大于 Working[j,2] 以添加到新数据框。

SNP 文件有 350 行,工作 6500 行。由于某种原因,我最终得到了 10000 行数据,这些数据不符合我的条件。

很明显我这里有问题吗?

for (i in 1:nrow(SNP_file)){
  for (j in 1:nrow(Working)){

if ((as.numeric(SNP_file[i,1]) >= as.numeric(Working[j,1])) && (as.numeric(SNP_file[i,1]) <= as.numeric(Working[j,2]))){
  New <- rbind(New, data.frame(Chromosome =Working[j, 1], 
                                    Start= Working[j, 2], 
                                    Stop = Working[j, 3], 
                                    GO = Working[j,4],
                                    Position = VCF[i,1],
                                    REF = SNP_file[i,2],
                                    GT = SNP_file[i,3],
                                    Site_Conf = SNP_file[i,4]
                                    ))
}}}

谢谢,

J

【问题讨论】:

    标签: r error-handling dataframe


    【解决方案1】:

    你可以避免for循环,因为比较是矢量化的:

    indx <- SNP_file[,1] >= Working[,1] & SNP_file[,1] <= Working[,2]
    [1]  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
    

    这会输出满足条件的行的逻辑向量。这非常有用,因为现在您可以将该向量用作子集的索引。

    newdf <- cbind(SNP_file[indx,2], Working[indx,2:3])
    

    在这种情况下,我将SNP 的第二列以及Working 的第二和第三列分配给了一个新的数据框。并且只有满足条件的行。


    为了清楚起见,这只是一个示例。您的示例不可重现,但请尝试以下操作:

    Working <- Working[1:nrow(SNP_file),]
    indx <- as.numeric(SNP_file[,1]) >= as.numeric(Working[,1]) & as.numeric(SNP_file[,1]) <= as.numeric(Working[,2])
    New <- data.frame(Chromosome =Working[indx, 1], 
                      Start     = Working[indx, 2], 
                      Stop      = Working[indx, 3], 
                      GO        = Working[indx, 4],
                      Position  = VCF[indx, 1],
                      REF       = SNP_file[indx,2],
                      GT        = SNP_file[indx,3],
                      Site_Conf = SNP_file[indx,4]
                                        )
    

    注意两个数据帧的长度不相等。 Working 的前 350 行与 SNP_file 进行了比较。如果您以不同的方式进行比较,则应指定。

    数据

    set.seed(7)
    SNP_file <- data.frame(x=sample(10), y=month.abb[1:10])
    Working <- data.frame(x=sample(10), y=sample(20,10), z=(sample(LETTERS[1:10])))
    

    【讨论】:

    • 如 OP 所述,SNP 文件中有 350 行,Working 文件中有 6500 行。您的代码解决了具有相同索引的行的问题。但是,不清楚应该如何处理 Working 文件的另外 6150 行。我错过了什么吗? (在我看来,OP 想要使用来自另一个文件的信息来过滤一个文件,尽管没有明确说明。)
    • @Daniel 是的,他们应该澄清这一点。目前,将 Working 子集到前 350 行将进行一对一的比较。
    【解决方案2】:

    从您的原始帖子中不清楚您想要实现什么。索引 ij 是如何相互对应的?你能举出数据的例子(输入和期望的输出)吗?

    您的代码中的循环重复 6500 * 350 = 2275000 次,并将 SNP_file 中的 每一 行与 Working 中的 每一 行进行比较.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多