问题
我在讲R语言基础课程时,放了一道练习题,让学员生成如下数据框:
我给出的答案是:
df <- data.frame(gene=paste0("gene",1:15),
s1=rnorm(15),
s2=rnorm(15),
s3=rnorm(15))
tips:rnom是一个生成随机数的函数,括号里的15代表生成随机数的数量是15个。
遇到了一位学员提了个问题:后三列的列名有规律,内容也都是随机数,如果有需求生成10列、100列,有没有其他方法快捷生成?
方法一:利用矩阵
我想到的第一种方法时用矩阵生成,然后转换为数据框。
因为矩阵就是在向量的基础上增加了行和列的属性
,如下:
df2=matrix(rnorm(45),ncol = 3)
df2=data.frame(df2)
df2=cbind(gene=paste0("gene",1:15),df2)
df2
思路非常简单:先生成45个随机数,然后将他们排列为三列,同样的道理,要生存10列那就是10×15个随机数,排列为10列。
方法二:利用for循环和列表
这个思路就相对难一点:
1.先赋值一个空数据,只定义他的数据结构是列表。
2.然后用for循环进行批量赋值,将这些值储存在列表里,成为列表的元素。元素名是s1,s2。。。s10。
3.用as.data.frame将列表转换为数据框。
test=list()
#定义行数。n等于几,就会生成几列。
n=10
for(i in 1:n){
test[[i]] <- rnorm(15)
}
df3 = as.data.frame(test)
colnames(df3) <- paste0("s",1:n)
df3=cbind(gene=paste0("gene",1:15),df3)
df3
将这些代码复制到Rstudio即可直接运行。
补充:现在查看左边的变量窗口
i的值是10L,代表的是整数10,这里的L是为了强调,区分数值型数据的两个分支,即整型和双精度型,之所以是是10,是因为for循环多次运行了大括号内的代码,最后一轮i的值是10。
微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!
我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告
网友评论