2014-09-02 73 views
1

R newb;試圖根據先前的問題來解決這個問題,但並沒有取得任何成功。我有數據,看起來大致如下所示:r基於兩列的累計和

Name  Date  Value 
A  2014-09-11 1.23 
A  2014-12-11 4.56 
A  2014-03-01 7.89 
A  2014-06-05 0.12 
B  2014-09-25 9.87 
B  2014-12-21 6.54 
B  2014-11-12 3.21 

我期待一個數據幀上執行以下任務:添加計算列名的累積發生(其中包含字符串索引列,不是因素)。對於每個「名稱」,使用索引爲k-1的元素替換給定名稱的累積索引k或更大的所有元素。

所以對於k = 4,則結果將是:

Name  Date  Value 
A  2014-09-11 1.23 
A  2014-12-11 4.56 
A  2014-03-01 7.89 
A  2014-06-05 7.89 
B  2014-09-25 9.87 
B  2014-12-21 6.54 
B  2014-11-12 3.21 

在如何做到這一點在慣用ř任何提示;在框架上循環可能會起作用,但我試圖按照它的意圖去學習,並在旅途中選擇一些R技能。

+0

這是'k == 3'或'k == 4'?另外,您希望的輸出中的索引列在哪裏? – 2014-09-02 20:32:38

+0

我的不好,我應該寫下(現在已更正)「用索引_k-1_處的元素替換累積索引k或更大的所有元素」 – Bram 2014-09-02 21:08:05

回答

4

我認爲你正在尋找這樣的:

require("data.table") 

A = data.table(
Name = c("A","A","A","A","B","B","B"), 
Date = c("2014-09-11", "2014-12-11", "2014-03-01", "2014-06-05", "2014-09-25", "2014-12-21", "2014-11-12"), 
Value = c(1.23, 4.56, 7.89, 0.12, 9.87, 6.54,3.21)) 


A[,IX:=seq(1,.N),by="Name"] 

enter image description here

編輯:(既然你糾正的問題,我更新我的答案)

func = function(x,b){return(c(x[seq(1,b)],rep(x[b],length(x)-b)))} 
k = 4 
A[,Value:=func(Value,k-1),by="Name"] 

enter image description here

+0

這需要處理累積索引部分,但尚未用於替換部分。取得值的索引很容易,但我並沒有很快看到如何讓值取代它們(一些聰明的使用代表可能?) – Bram 2014-09-02 21:09:50