使用最新的不丢失行中的值并应用滚动功能

时间:2019-02-02 12:13:31

标签: r function na rollapply

我有类似

的数据
DT <- data.frame(id=rep("A",times=10),B=1:10, C=c(NA,2:5,NA,NA,NA,NA,NA))
CT <- DT[,c(2,3)]*3
CT$id <- rep("B",times=10)
DT <- rbind(DT,CT)

我想用其先前的值加上其他列B的值的函数(在第C行中忽略第一个NA)来填充C列中的NA,例如:

DT$C[6] =DT$C[5]+DT$B[6]*0.3
DT$C[7] =DT$C[6]+DT$B[7]*0.3
DT$C[8] =DT$C[7]+DT$B[8]*0.3

此外,我需要通过id值(表中的列id)复制它。下面是带有三个手动计算值的示例图片。感谢您的建议!

enter image description here

2 个答案:

答案 0 :(得分:1)

在NA细胞用于填充式等同于使用填充它们na.locf加服用B对应于NA值在C

因此,首先为分组向量创建一个表达式,将唯一编号与每个非NA和每个连续的NA关联。

rleid(seq_along(C) * !is.na(C)))

有关每个这些基团的计算B * is.na(C),它是0,如果组具有一个非NA元件和为cumsum如果组由连续的的NAS

这提供了以下单语句解决方案:

library(data.table)
library(zoo)

transform(DT, C = ave(C, id, FUN = na.locf0) + 
      0.3 * ave(B * is.na(C), rleid(seq_along(C) * !is.na(C)), id, FUN = cumsum))

给予:

   id  B    C
1   A  1   NA
2   A  2  2.0
3   A  3  3.0
4   A  4  4.0
5   A  5  5.0
6   A  6  6.8
7   A  7  8.9
8   A  8 11.3
9   A  9 14.0
10  A 10 17.0
11  B  3   NA
12  B  6  6.0
13  B  9  9.0
14  B 12 12.0
15  B 15 15.0
16  B 18 20.4
17  B 21 26.7
18  B 24 33.9
19  B 27 42.0
20  B 30 51.0

答案 1 :(得分:0)

这是index.html中的accumulate的一种方法

purrr