Một cách tiếp cận là sử dụng cumsum()
và lừa dối một chút. Ví dụ, cho K
:
K <- 1:10
và để giữ cho mọi thứ đơn giản tôi thêm 1
(không 100
) để K[1]
, chúng tôi muốn sản xuất:
> 1 + K[1]
[1] 2
> (1 + K[1]) + K[2]
[1] 4
> ((1 + K[1]) + K[2]) + K[3]
[1] 7
....
Đây là một khoản tiền tích lũy. Chúng tôi cần phải ăn gian một chút với hằng số bạn muốn thêm vào phần tử đầu tiên vì chúng tôi chỉ muốn điều đó ảnh hưởng đến yếu tố đầu tiên đó, không được thêm vào từng phần tử. Do đó đây là sai
> L <- cumsum(1 + K)
> L
[1] 2 5 9 14 20 27 35 44 54 65
gì chúng tôi thực sự muốn là:
> L <- cumsum(c(1, K))[-1]
> L
[1] 2 4 7 11 16 22 29 37 46 56
Trong đó chúng tôi tiếp nhau hằng số vào vector K
là yếu tố đầu tiên và áp dụng cumsum()
đó, nhưng thả các phần tử đầu tiên của đầu ra từ cumsum()
.
lon Điều này tất nhiên được thực hiện trong một thời trang tương đối đơn giản:
> L <- 1 + cumsum(K)
> L
[1] 2 4 7 11 16 22 29 37 46 56
tức là tính toán cumusum()
và sau đó thêm vào hằng số (mà bây giờ tôi thấy là những gì @ gd047 đã đề xuất trong trả lời của họ.)
Nguồn
2012-10-24 10:50:22
+1 Gọn gàng - Tôi đã bỏ lỡ điều đó khi tôi bắt đầu viết Câu trả lời của mình, chỉ để nó bình minh cho tôi khi tôi kết thúc. –
+1 Tôi đã gặp khó khăn trong việc tìm kiếm một giải pháp được vector hóa và quay trở lại sử dụng vòng lặp 'for'. Thời gian trong câu trả lời của tôi cho thấy rằng điều này là khủng khiếp chậm so với sử dụng 'cumsum'. –