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
有几种方法可以解决上述问题:
- 将取子集的数据转换为字符串
Gene2<-as.character(Gene2)
- 用
match
进行匹配
data2 <- data[,match(Gene2,colnames(data))]
- 用
which
进行匹配
data2 <-data[,which(colnames(data) %in% Gene2)]
- 提前设定环境变量,使得在数据录入时,不会成为Factor
options(stringsAsFactors = FALSE)