美文网首页R语言R语言与统计分析
这真是危险的关系,明明你错了,但是她认了

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

作者: 9d760c7ce737 | 来源:发表于2019-06-26 23:35 被阅读28次

    初学者学习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语言里面的数据保存为其他格式呢?
    好了,我是果子,我们明天见。

    相关文章

      网友评论

        本文标题:这真是危险的关系,明明你错了,但是她认了

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