美文网首页R语言作业
2019-12-22【生信技能树】一个R考题

2019-12-22【生信技能树】一个R考题

作者: 猫叽先森 | 来源:发表于2019-12-22 15:34 被阅读0次

    题目来源:http://www.bio-info-trainee.com/4458.html
    题目如下,

    打开你的Rstudio,运行下面的代码:

    set.seed(0.12345)
    n=26
    df=data.frame(LETTERS,rnorm(n),rnorm(n),
       rnorm(n),rnorm(n),rnorm(n))
    a=lapply(2:ncol(df), function(i){
       x=df[,c(1,i)]
       x=x[x[,2]>0,]
       return(x)
    })
    

    很明显,开始有一个数据框如下:



    然后就不小心被lapply这个循环弄成了长短不一的list,这个时候需要把长短不一的list再次还原为数据框或者矩阵,大概如下:



    之前那些因为小于0所以被过滤掉的这个时候还原到数据框里面,需要补为0即可。
    set.seed(0.12345)
    n=26
    df=data.frame(LETTERS,rnorm(n),rnorm(n),
                  rnorm(n),rnorm(n),rnorm(n))
    a=lapply(2:ncol(df), function(i){
      x=df[,c(1,i)]
      x=x[x[,2]>0,]
      return(x)
    })
    ##df是一个数据框
    ##a是一个list
    ##查看a的第一个元素
    head(a[[1]])
    #   LETTERS  rnorm.n.
    #1        A 1.2629543
    #3        C 1.3297993
    #4        D 1.2724293
    #5        E 0.4146414
    #10       J 2.4046534
    #11       K 0.7635935
    str(a[[1]])
    #'data.frame':  12 obs. of  2 variables:
    # $ LETTERS : Factor w/ 26 levels "A","B","C","D",..: 1 3 4 5 10 11 17 19 22 #23 ...
    # $ rnorm.n.: num  1.263 1.33 1.272 0.415 2.405 ...
    ##可以发现a的元素都是data.frame,所以第一反应是用merge拼数据框
    length(a)
    #[1] 5
    new_df <- data.frame(LETTERS)
    for (i in 1:length(a)) {
      new_df <- merge(new_df,a[[i]],by='LETTERS',all.x = T)
    }
    dim(new_df)
    #[1] 26  6
    ##用LETTERS列替换行名,然后删除LETTERS列
    rownames(new_df) <- new_df[,1]
    new_df <- new_df[,-1]
    ##查看题目中说到的被删除的G行
    new_df['G',]
    #  rnorm.n. rnorm.n..1 rnorm.n..2 rnorm.n..3 rnorm.n..4
    #G       NA         NA         NA         NA         NA
    ##全部为NA,所以被删掉了。
    ##删掉全部为NA的行
    new_df <- new_df[rowSums(is.na(new_df)) != ncol(new_df),]
    ##把剩下的NA替换为0
    new_df[is.na(new_df)] <- 0
    

    相关文章

      网友评论

        本文标题:2019-12-22【生信技能树】一个R考题

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