我试图在每个组中找到列w
中的第一个非NA元素,然后构造一个新变量,该变量从该非NA元素的索引开始并遵循以下运动规律:
k_{it+1}=k_{it}+s_{it+1}-s{it}
。
i
表示组,t
是时间。 k_{i1}
来自列w
的第一个非NA元素。
假设我有以下数据集:
DF <- data.frame("time"=factor(c(1999,2000,2001,2002,1999,2000,2001,2002)),
"i"=factor(c("a","a","a","a","b","b","b","b")),
"w"=c(NA,1,2,4,4,NA,3,4), "s"= c(10,20,10,22,45,30,20,40))
我想向其中添加一个新列:
DF$k <- c(NA, 1, -9, 3, 4, -11, -21, -1)
答案 0 :(得分:1)
我们可以编写一个使用以下公式来计算值的函数:
library(dplyr)
apply_fun <- function(x,y){
inds <- which.max(!is.na(x))
vals <-rep(NA, length(x))
c(rep(NA, inds - 1), Reduce(`+`, y[(inds+1):length(y)] - y[inds:(length(y) - 1)],
accumulate = TRUE, init = x[inds]))
}
然后按组应用
DF %>%
group_by(i) %>%
mutate(k = apply_fun(w, s))
# time i w s k
# <fct> <fct> <dbl> <dbl> <dbl>
#1 1999 a NA 10 NA
#2 2000 a 1 20 1
#3 2001 a 2 10 -9
#4 2002 a 4 22 3
#5 1999 b 4 45 4
#6 2000 b NA 30 -11
#7 2001 b 3 20 -21
#8 2002 b 4 40 -1
答案 1 :(得分:0)
以下代码有效,但是,我不得不使用for
,对于大型数据集,我认为它不够快:
apply_fun <- function(x,y){
inds <- which.max(!is.na(x))
vals <-rep(NA, length(x))
vals[inds]<-x[inds]
for (i in (inds+1):length(x)){
vals[i] <- vals[i-1]+y[i]-y[i-1]
}
vals
}
DF %>%
group_by(i) %>%
mutate(k = apply_fun(w, s))