2014-09-02 108 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