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