数据科学与R语言R 语言 生信分析

DeBug: R 之取子集的bug

2019-02-28  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读