【问题标题】:R programming: selecting rows based on their numeric value in different columnsR编程:根据不同列中的数值选择行
【发布时间】:2016-01-12 10:16:31
【问题描述】:

我寻找了类似的问题,但找不到根据不同列中的数值选择行的答案。我有一个看起来像这样的数据集(总共包括 24 个研究/列和超过 28.000 行)

    header <- c("symbol", "gene1", "gene2", "gene3")
    study1 <- c("0.06", "0.01", "NA", "NA")
    study2 <- c("0.09", "NA", "0.02", "0.08", "0.07")
    study3 <- c("0.09", "NA", "NA", "0.1")
    DF<- data.frame(header, study1, study2, study3, stringsAsFactors=FALSE)
    DF

    ID study1 study2 study3
    1 gene1   0.06   0.09   0.09
    2 gene2   0.01     NA     NA
    3 gene3     NA   0.02     NA
    4 gene4     NA   0.07    0.1

>

我想创建一个新的 data.frame,其中包含所有列,但仅包含至少一项研究(即一列)的值 0.05

因为我是 R 编程的初学者,所以我从只为一列编写代码过滤开始,并且通过应用“which”可以正常工作

    new_DF<-DF[which(as.numeric(DF$study1)<=0.05),] 

在此之前,我对自己感到非常高兴 :-),但是,我该如何调整它以适应多个列?我尝试包含通配符“*”

    new_DF<-DF[which(as.numeric(DF$study*)<=0.05),] 

但我在“new_DF

谁能帮助我? 非常感谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用rowSums 对具有至少一个小于或等于 0.05 的值的行进行子集化。将数据集转换为逻辑矩阵(DF[-1] &lt;= 0.05 - -1 是删除非数字的第一列)。上面的输出将有TRUE/FALSE/NA。当我们用na.rm=TRUE 执行rowSums 时,我们得到每行中小于或等于0.05 的元素数。对于第 1 行和第 4 行,没有满足条件的元素,因此总和将为 0,而对于其他行则不为 0。当我们否定 (!) 时,0 将被转换为 TRUE,其他所有元素都为 FALSE。但是,我们需要删除带有 0 的行,因此再次取反以将 T​​RUE 更改为 FALSE,反之亦然。然后,我们使用这个逻辑向量索引进行子集化。

     DF[!!rowSums(DF[-1] <= 0.05, na.rm=TRUE),]
     #     ID study1 study2 study3
     #2 gene2   0.01     NA     NA
     #3 gene3     NA   0.02     NA
    

    【讨论】:

    • 抱歉之前的评论是错误的 :-) 我的预期输出是行的子集,所以第一个选项。但是,我担心我会丢失 1 列中 0.05 的行,不是吗?我不完全理解你写的代码,想 - “!!”是什么意思?代表? “!”我认为是反转/负数,所以这将是双重负数?或者这是否意味着您取所有行的总和,但单独考虑每个值? - [-1] 表示您不考虑选择第​​一列(因为它是 ID)?
    • @khardies 我添加了一些解释。
    • 非常感谢,知道我尝试将此应用于类似问题 :-)
    【解决方案2】:

    我想你的问题是你有大量的研究,对吧?你可以这样做,但可能有更好的方法:

    header <- c("symbol", "gene1", "gene2", "gene3")
    study1 <- c("0.06", "0.01", "NA", "NA")
    study2 <- c("0.09", "NA", "0.02", "0.08")
    study3 <- c("0.09", "NA", "NA", "0.1")
    DF<- data.frame(header, study1, study2, study3, stringsAsFactors=FALSE)
    
    
    nrstudies <-3 #change the number of studies to fit your study
    text <- ""
    formtext <-"(DF$studyNR <= 0.05)"
    
    for(i in 1:nrstudies){
      newtext<-gsub("NR",i,formtext) # substitutes the Substring "NR" for i 
    
     if(i!=1){
              text<- paste(text, newtext, sep="|")
     }else{
              text <- newtext
     }
    }
    
    DF <- DF[eval(parse(text=text)),]
    

    【讨论】:

    • 解析就像 R 中的 for 循环:大多数时候,它们不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2020-09-29
    相关资源
    最近更新 更多