DeBug: R 之取子集的bug

作者: 茶思饭 | 来源:发表于2019-02-28 10:12 被阅读0次

    在项目过程中,取子集时发生了bug,现在将我遇到的问题总结一下:
    R 版本:3.5.0
    操作系统:Windows7/Rstudio

    Gene2 <- c("GRMZM2G324390", "GRMZM2G435034","GRMZM2G125529",   "GRMZM2G173542", "GRMZM2G050912", "AC234185.1_FG004", "GRMZM2G149576",   "GRMZM2G128617", "GRMZM2G020898","GRMZM2G104283")
    Gene <-c("AC203535.4_FG002", "GRMZM2G408703", "GRMZM2G031311", "GRMZM2G011932", "GRMZM2G171116", "GRMZM2G099528",   "GRMZM2G004006", "GRMZM2G139329", "GRMZM2G371795", "GRMZM2G090087","GRMZM2G324390", "GRMZM2G435034","GRMZM2G125529", "GRMZM2G173542", "GRMZM2G050912", "AC234185.1_FG004", "GRMZM2G149576",   "GRMZM2G128617", "GRMZM2G020898","GRMZM2G104283")
    a<- c(1: 20)
    b<- c(11:30)
    ab <-c(21:40)
    data<-as.data.frame(rbind(a,b,ab))
    colnames(data) <-Gene
    Gene %in% Gene2
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    [17]  TRUE  TRUE  TRUE  TRUE
     data2 <-data[,Gene2]
    colnames(data) %in% colnames(data2) 
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    [17]  TRUE  TRUE  TRUE  TRUE
    

    从上面的代码可以看出,取子集的结果是正确的,但有些时候Gene2是从data.frame中选取的,这时Gene2 的class不是character而是factor

    这时候取子集就会出现问题。

    Gene2 <-as.factor(Gene2)
    data2 <-data[,Gene2]
    colnames(data) %in% colnames(data2) 
    [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    [17] FALSE FALSE FALSE FALSE
    

    有几种方法可以解决上述问题:

    1. 将取子集的数据转换为字符串
      Gene2<-as.character(Gene2)
    2. match进行匹配
      data2 <- data[,match(Gene2,colnames(data))]
    3. which 进行匹配
      data2 <-data[,which(colnames(data) %in% Gene2)]
    4. 提前设定环境变量,使得在数据录入时,不会成为Factor
      options(stringsAsFactors = FALSE)

    总结:

    对数据框进行取子集时要小心,确保提交的是字符串,而不是factor

    相关文章

      网友评论

        本文标题:DeBug: R 之取子集的bug

        本文链接:https://www.haomeiwen.com/subject/rlmcuqtx.html