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
,但我想知道您的预期输出是否正确如果您需要累积
谢谢您的更新