R根据以前观察到的值创建列

时间:2016-01-26 13:47:46

标签: r dataframe

我想创建一个新列,报告报告的col1值大于零,直到遇到大于零的新col1值(参见df2中的col2)。即col1中的零值被大于零的观测值替换。

ID = c(1,1,1,1,1,1,1,1,2,2,2,2)
col1 = c(500,0,0,0,600,0,0,0,450,0,0,0)
df1 = data.frame(ID,col1)

ID = c(1,1,1,1,1,1,1,1,2,2,2,2)
col1 = c(500,0,0,0,600,0,0,0,450,0,0,0)
col2 = c(500,500,500,500,600,600,600,600,450,450,450,450)
df2 = data.frame(ID,col1,col2)

任何方式这样做?

2 个答案:

答案 0 :(得分:6)

我们可以将data.tablezoo一起使用。将'data.frame'转换为'data.table'(setDT(df1)),使用值'col1'指定新列'col2',将'0'的元素更改为NA然后使用na.locf将NA元素替换为以“ID”分组的先前非NA元素。

library(zoo)
library(data.table)
setDT(df1)[, col2:=col1][col2==0, col2:= NA]
df1[,col2:= na.locf(col2) ,ID]
df1
#    ID col1 col2
# 1:  1  500  500
# 2:  1    0  500
# 3:  1    0  500
# 4:  1    0  500
# 5:  1  600  600
# 6:  1    0  600
# 7:  1    0  600
# 8:  1    0  600
# 9:  2  450  450
#10:  2    0  450
#11:  2    0  450
#12:  2    0  450

答案 1 :(得分:3)

此外,使用似乎有效的累积函数:

with(df1, ave(col1, ID, FUN = function(x) 
                      x[cummax(sign(x) * seq_along(x))]))
#[1] 500 500 500 500 600 600 600 600 450 450 450 450