2013-10-11 36 views
8

Về cơ bản tôi muốn tạo ra một chuỗi, nói:Tạo một chuỗi như 112123123412345

n là 2, trình tự sẽ là 112
n là 3, dãy là 112.123
n là 5, chuỗi là 112123123412345

tôi đã tìm ra một giải pháp

n=5 
seq=1 
for (i in 2:n){ 
    seq=c(seq,rep(1:n,len=i)) 
} 

tôi tự hỏi nếu có một cách có thể làm điều đó mà không cho vòng lặp?

Trả lời

18

Sử dụng sequence:

> sequence(1:5) 
[1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
+8

Ngoài ra còn có điều gì đó hơi thỏa mãn khi thực hiện trình tự (chuỗi (5)) ':-) – flodel

+0

@flodel: Tôi thích nó! –

+4

@Chris: hãy nhớ đọc phần "Xem thêm" của các tệp trợ giúp. '? seq' đề cập đến' chuỗi' ở đó. –

7

Đây là một khả năng:

n<-5 
unlist(lapply(1:n,function(x) 1:x)) 
## [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
+2

thêm chức năng, sẽ được 'ngừng công bố (lapply (seq (n), seq))' – flodel

+1

+1, kể từ 'sequence' được định nghĩa là 'function (nvec) không công khai (lapply (nvec, seq_len)) '. –

+0

Cảm ơn rất nhiều bạn! Mặc dù câu hỏi này có thể được giải quyết theo trình tự(), nó thực sự là một câu hỏi từ thực hành hướng dẫn của tôi, hỏi làm thế nào để làm điều gì đó bằng cách sử dụng lapply() thay vì vòng lặp, tôi nghĩ đây là câu hỏi hướng dẫn đang tìm kiếm. –

4

Nó muốn làm một cái gì đó như:

do.call('c', sapply(1:5, seq, from = 1)) 
# [1] 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
1

tôi misread câu hỏi là "làm thế nào để tạo ra rằng trình tự puzzler gây phiền nhiễu ", đi theo số 1,11,21,1112,3112, ... :-). Vì vậy, tôi nghĩ tôi cũng có thể viết một giải pháp cho điều đó.

puzseq<-function(seqlen) { 
theseq<- list(1) 
for(j in 2:seqlen) { 

thetab<-table(theseq[[j-1]]) 
theseq[[j]]<-unlist(sapply(1:length(thetab), function(k) c(thetab[k], as.numeric(names(thetab)[k])))) 
} 
return(theseq) 
} 
+1

Điều này rất khó đọc; định dạng mã không phải là tiêu chuẩn và không nhất quán. –

+0

@ClaytonStanley bạn có thể làm rõ những gì bạn thấy không rõ ràng? Nó tốt hơn là thiếu thụt lề cho nội dung vòng lặp! –

Các vấn đề liên quan