Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R使用先前更新值中的信息更新分组df中的值_R_Dplyr_Grouping_Purrr_Lag - Fatal编程技术网

R使用先前更新值中的信息更新分组df中的值

R使用先前更新值中的信息更新分组df中的值,r,dplyr,grouping,purrr,lag,R,Dplyr,Grouping,Purrr,Lag,我希望在不同的时间点(timepoint)使用先前更新的/muated值,根据此函数有条件地对组(id)内的变量(var1,var2)进行变异: change_function <- function(value,pastvalue,timepoint){ if(timepoint==1){valuenew=value} else if(value==0){valuenew=pastvalue-1} if(value==1){valuenew=pastvalue}

我希望在不同的时间点(
timepoint
)使用先前更新的/muated值,根据此函数有条件地对组(
id
)内的变量(
var1,var2
)进行变异:

change_function <- function(value,pastvalue,timepoint){
  if(timepoint==1){valuenew=value} else
    if(value==0){valuenew=pastvalue-1}
    if(value==1){valuenew=pastvalue}
    if(value==2){valuenew=pastvalue+1}
  return(valuenew)
  }
# write a vectorized function
change_function <- function(prev, new) {
  change=if_else(new==0,-1,
          if_else(new==1,0,1))
  if_else(is.na(new), new, prev + change)
}

# use purrr:accumulate 
df %>%
  group_by(id) %>% 
  mutate_at(.vars=vars(var1,var2),
            .funs=funs(accumulate(.,change_function)))

# A tibble: 8 x 4
# Groups:   id [2]
     id timepoint  var1  var2
  <dbl>     <dbl> <dbl> <dbl>
1     1         1     1     2
2     1         2     0     1
3     1         3     0     1
4     1         4     1     2
5     2         1     2     3
6     2         2     3     4
7     2         3     3     4
8     2         4     2     3
我的方法:使用dplyr::mutate_at使用我的函数

library(dplyr)
df %>% 
  group_by(id) %>% 
  mutate_at(.vars=vars(var1,var2),
            .funs=funs(.=change_function(.,dplyr::lag(.),timepoint)))
但是,这不起作用,因为if/else没有矢量化

更新1:

使用嵌套的ifelse函数不会给出所需的输出,因为它不使用更新的
pastvalue

change_function <- function(value,pastvalue,timepoint){
  ifelse((timepoint==1),value,
         ifelse((value==0),pastvalue-1,
                ifelse((value==1),pastvalue,
                       ifelse((value==2),pastvalue+1,NA))))
  }

library(dplyr)
df %>% 
  group_by(id) %>% 
  mutate_at(.vars=vars(var1,var2),
            .funs=funs(.=change_function(.,dplyr::lag(.),timepoint)))

     id TimePoint  var1  var2 var1_. var2_.
  <dbl>     <dbl> <dbl> <dbl>  <dbl>  <dbl>
1     1         1     1     2      1      2
2     1         2     0     0      0      1
3     1         3     1     1      0      0
4     1         4     2     2      2      2
5     2         1     2     3      2      3
6     2         2     2     2      3      4
7     2         3     1     1      2      2
8     2         4     0     0      0      0
更改函数%
分组依据(id)%>%
在(.vars=vars(var1,var2)处突变,
.funs=funs(.=change_函数(,dplyr::lag(,timepoint)))
id时间点var1 var2 var1\。瓦鲁。
1     1         1     1     2      1      2
2     1         2     0     0      0      1
3     1         3     1     1      0      0
4     1         4     2     2      2      2
5     2         1     2     3      2      3
6     2         2     2     2      3      4
7     2         3     1     1      2      2
8     2         4     0     0      0      0
更新2:


根据评论,
purrr:acculate
可以使用

多亏了akrun,我可以获得正确的功能:

change_function <- function(value,pastvalue,timepoint){
  if(timepoint==1){valuenew=value} else
    if(value==0){valuenew=pastvalue-1}
    if(value==1){valuenew=pastvalue}
    if(value==2){valuenew=pastvalue+1}
  return(valuenew)
  }
# write a vectorized function
change_function <- function(prev, new) {
  change=if_else(new==0,-1,
          if_else(new==1,0,1))
  if_else(is.na(new), new, prev + change)
}

# use purrr:accumulate 
df %>%
  group_by(id) %>% 
  mutate_at(.vars=vars(var1,var2),
            .funs=funs(accumulate(.,change_function)))

# A tibble: 8 x 4
# Groups:   id [2]
     id timepoint  var1  var2
  <dbl>     <dbl> <dbl> <dbl>
1     1         1     1     2
2     1         2     0     1
3     1         3     0     1
4     1         4     1     2
5     2         1     2     3
6     2         2     3     4
7     2         3     3     4
8     2         4     2     3
#编写一个矢量化函数
更改功能%
分组依据(id)%>%
在(.vars=vars(var1,var2)处突变,
.funs=funs(累加(,改变函数)))
#一个tibble:8x4
#组别:id[2]
id时间点var1 var2
1     1         1     1     2
2     1         2     0     1
3     1         3     0     1
4     1         4     1     2
5     2         1     2     3
6     2         2     3     4
7     2         3     3     4
8     2         4     2     3

if/else不是矢量化谢谢@akrun。我可以不使用if/else而只使用if吗?您可以使用矢量化的
ifelse
,但我想知道您的预期输出是否正确如果您需要
累积
谢谢您的更新