比如:y<-seq(1:10);如何自动生成变量“a1","a2","a3",然后能够调用这些变量进行赋值?比如赋值a1<-y[1:3],但是这些变量要在循环中,类似for(i in 1:3) ai<-......请问该如何做到?谢谢
【求助】如何在R程序批量生成变量并调用赋值
- 已编辑
请查阅R语言的数据结构相关知识,你的问题自然迎刃而解,比如AdvancedR中的Data structure 。
- 回到问题
在你的例子里,调用方式为y[1], y[2], y[3]
for 循环举例
r
~~for (i in 1:3){
~~ y[i] <- NA
~~}
~~
好吧题目看错。 做法还是看 dapengde 的方法,虽然可行不过不建议这么做。
- 但是,并不建议这么做,而且在使用R的过程中请学会尽量避免使用循环。因为:R与其他编程语言区别很大d
的一点是所有变量都储存于向量(vector)之中,即使只有一个变量。优势是通过向量化的运算大大提高了效率,大部分其他语言里的循环操作实现的任务,在R里 完全不需要for循环。
有关R的向量化,建议仔细读一下这篇博客。
tjmath
按你的描述,身为一个有责任心的Ruser我觉得必须阻止初学R的小伙伴误入歧途。
按你的描述写出来的代码是很危险的,楼上yihui 跟我之前都吐槽过了。我们来看看按你的思路的程序会有什么样的问题:
1. 循环产生大量变量充斥workspace,可读性差,难以维护
2. 数据难以再次利用。列数据的子集存入多个变量,难以保存,难以复用
所以不要这样做。
请在R里使用data.frame的数据结构进行工作,这样可以避免大部分问题。
最基本做到:在对数据操作的时候,想象成所有数据都储存在一张表里,每一个数据点(observation)为一行,由不同的列变量(variable)进行描述。
按你的描述,我觉得比较好的做法是做一个label列,作为该列数据的子集的标签。然后要使用每个子集的时候直接[
或filter取子集就行了。
举例:
df
a b label
1 1 1 groupA
2 2 2 groupA
3 3 3 groupA
4 4 4 groupA
5 5 5 groupA
6 6 6 groupB
7 7 7 groupB
8 8 8 groupB
9 9 9 groupB
10 10 10 groupB
取子集
df[df$label=="groupA"]
a b label
1 1 1 groupA
2 2 2 groupA
3 3 3 groupA
4 4 4 groupA
5 5 5 groupA
求每个子集的a列的和,b列的和,最大值,最小值,中位
library(dplyr)
a %>%
group_by(label) %>%
summarise(suma=sum(a),sumb=sum(b),maxa=max(a),minb=min(b),mediana=median(a))
label suma sumb maxa minb mediana
<chr> <int> <int> <dbl> <dbl> <int>
1 groupA 15 15 5 1 3
2 groupB 40 40 10 6 8
- 已编辑
还是不太明白,我也有相似的问题,我要做的读入一段DNA序列,然后计算前n个的子序列中各个碱基的个数总和,并分别表示a [ i ] 的形式,应该用什么样的循环啊,自己编的程序太复杂,而且慢,请求各位大神指教,困扰很久了,谢谢?
- 已编辑
问对人了。
如果是我的话,读入DNA序列并进行处理这种操作很常规,做之前会去先查一查有没有现成的工具可以用。
包的名字叫seqinr
,用的很多,网上搜搜教程应该有一大把
举例:
install.packages("seqinr")
library(seqinr)
# read a sequence
url = "https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?id=1090936428&db=nuccore&report=fasta&extrafeat=0&fmt_mask=0&maxplex=1&sendto=t&withmarkup=on&tool=portal&log$=seqview&maxdownloadsize=1000000"
seq <- seqinr::read.fasta(url)
n1 <- seq$KU902450.1
## n1 looks like this:
n1
[1] "t" "c" "t" "g" "a" "c" "t" "g" "c" "t" "t" "t" "t" "t" "c" "a" "c" "c" "c" "a" "t" "c" "t" "a" "c" "a" "g" "t" "c"
[30] "c" "c" "c" "c" "t" "t" "g" "c" "c" "g" "t" "c" "c" "c" "a" "a" "g" "c" "a" "a" "t" "g" "g" "a" "t" "g" "a" "t" "t"
[59] "t" "g" "a" "t" "g" "c" "t" "g" "t" "c" "c" "c" "c" "g" "g" "a" "c" "g" "a" "t" "a" "t" "t" "g" "a" "a" "c" "a" "a"
...
# count number of nucleotides
count(n1,1)
a c g t
58 115 71 71
#count number of dinucleotides
count(n1,2)
aa ac ag at ca cc cg ct ga gc gg gt ta tc tg tt
11 17 18 12 26 51 9 28 16 24 17 14 5 23 27 16
#GC content
GC(n1)
[1] 0.5904762
R的强项就是几乎你想做的事情,几乎都能找到相关的包。以Bioconductor为代表的一系列工具更是必不可少的得力助手。
所以动手之前多查一查吧~~避免把时间浪费在重复造轮子上
- 已编辑
恩呢,谢谢您,这几个包我正在学习,能不能请您帮我看一下这段代码,需要怎么改进,
library(Biostrings)
seq_a<-readDNAStringSet(file.choose(),"fasta") #读fasta文件
seq<-seq_a[[1]]
l<-length(seq)
c<-rep(NA,l)
g<-rep(NA,l)
a<-rep(NA,l)
t<-rep(NA,l)
x<-rep(NA,l)
y<-rep(NA,l)
z<-rep(NA,l)
for(i in 1:l){
cc<-letterFrequencyInSlidingView(seq,"C",view.width = 1)
c [ i ]<-sum(cc[1:i]) # 计算前 i 个字母中c的个数,并赋值给c [ i ]
gg<-letterFrequencyInSlidingView(seq,"G",view.width = 1)
g[ i]<-sum(gg[1:i])
aa<-letterFrequencyInSlidingView(seq,"A",view.width = 1)
a[ i]<-sum(aa[1:i])
tt<-letterFrequencyInSlidingView(seq,"T",view.width = 1)
t[ i ]<-sum(tt[1:i])
x [ i ]<-(a[ i]+g[ i])-(c [ i]+t[ i])
y [ i ]<-(a[ i]+c[ i ])-(g[ i]+t[ i])
z [ i ]<-(a[ i]+t[ i])-(c[ i]+g[ i])
}
好的,谢谢?