R语言作业

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

2019-12-22  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读