R语言R语言与统计分析

这真是危险的关系,明明你错了,但是她认了

2019-06-26  本文已影响28人  9d760c7ce737

初学者学习R语言,必经之路报错,但是比报错更狠的是,明明你错了,但是她也认了。让你作出可用的图,但是数据全不对。
这个地方最大的坑就是R语言中的因子。

先讲第一个坑

假设我们这里有一个因子

dd <- factor(rep(seq(126,129),3))
dd

因子不能计算,所以我现在的需求是把他转为数值,用的是as.numeric()函数
dd1 <- as.numeric(dd)
dd1

然后我们崩溃了,跟想象中的完全不一样啊。
实际上此时as.numeric()函数把factor变成了因子的水平了
那怎么办呢?

因子转数值,必须先转为字符串,再转为数值

dd2 <- as.numeric(as.character(dd))
dd2

现在一切回归正常。
你犯了错,他不报错,但是有没有觉得很后怕呢?GEO芯如果数值都变成了因子,是不是感觉以前很有可能掉到坑里去了。别急,还有。

第二个坑

假设我们有一个数据框

set.seed(0625)
data <- data.frame(num1= sample(seq(1,500),26),
                   num2= sample(seq(1,500),26),
                   num3= sample(seq(1,500),26))
rownames(data) <- LETTERS
data <- data.frame(t(data))

这是一个数据框,R语言里面最常用的数据结构,列的名称是26个字母。

现在我想选择其中的几列,就使用列名去调取,分别是:"U","P","Y","T","M"

genelist <- factor(c("U","P","Y","T","M"))

我们课上讲过,截取数据有三种方式,分别是位置,逻辑和名称,



我们手上的是名称,那么就很好办了,直接有什么用什么。

data1 <- data[,genelist]

预想的数据应该是这样的



如果简单作图应该是这样的:


但是,实际情况是这样的!


简单作图后肯定是不一样的:



问题很严重对吧,他居然选择了完全不一样的列!

为什么呢?

还不是因子惹出来的货!
我们看一下,genelist的属性



这几个字母是因子,而因子是不能用来作为名称获取数据框的列的。

但你非要硬上, R语言默许了你的行为,并尝试去理解你的意图,最终选择先帮你转为数值再来获取,结果就是你俩触犯天条被二郎神追杀。

整个过程就变成了这样:

data2 <- data[,as.numeric(genelist)]

如何获取正确的结果?

第一,解决当下的困境,先把因子转为字符串

data3 <- data[,as.character(genelist)]

第二,防患未然,从源头上解决
发生这种情况大概率是你把基因列表先写成了txt文件,然后没有添加stringsAsFactors = F这个参数就读取进来了。
记得添加这个参数,或者使用data.table::fread()来智能无参数读取文件。

也可以在每次所有操作之前,运行一下这个语句,全局限定。

options(stringsAsFactors = F)

第三,习惯成自然,出图前,不要把数据读来读去
save函数把所有的中间文件保存为.Rdata格式,使用的时候load进来就可以了。
你从来没有把做好的PPT保存为word吧?那么为什么喜欢把R语言里面的数据保存为其他格式呢?
好了,我是果子,我们明天见。

上一篇下一篇

猜你喜欢

热点阅读