将功能应用于R数据帧中组的每个元素

时间:2019-12-14 03:15:09

标签: r dataframe

我试图在每个组中找到列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)

2 个答案:

答案 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))