如何使用dplyr通过分组变量循环ifelse函数
我试图为一组ID应用一个规则,在第一个实例中,一行中某个变量的值等于1,该组中所有后续行中另一个变量的值都等于1 基本上,我想做的是: 我有:如何使用dplyr通过分组变量循环ifelse函数,r,dplyr,R,Dplyr,我试图为一组ID应用一个规则,在第一个实例中,一行中某个变量的值等于1,该组中所有后续行中另一个变量的值都等于1 基本上,我想做的是: 我有: ID D 1 1 1 0 1 0 2 0 2 0 3 1 3 0 3 0 4 1 4 0 4 1 4 1 4 1 4 0 我想: ID D PREV 1 1 0 1 0 1 1 0 1 2 0 0 2 0 0 3 1 0 3 0 1 3 0 1 4 1 0 4 0 1 4 1 1
ID D
1 1
1 0
1 0
2 0
2 0
3 1
3 0
3 0
4 1
4 0
4 1
4 1
4 1
4 0
我想:
ID D PREV
1 1 0
1 0 1
1 0 1
2 0 0
2 0 0
3 1 0
3 0 1
3 0 1
4 1 0
4 0 1
4 1 1
4 1 1
4 0 1
我试图使用dplyr来迭代一系列分组行,每一行应用一个ifelse函数。我的代码如下所示:
data$prev = 0
data <-
data %>%
group_by(id)%>%
mutate(prev = if_else(lag(prev) == 1 | lag(d) == 1, 1, 0))
ID D PREV
1 1 0
1 0 1
1 0 0
2 0 0
2 0 0
3 1 0
3 0 1
3 0 0
4 1 0
4 0 1
4 1 0
4 1 1
4 0 1
有人能帮我吗?您可以使用dplyr
dplyr::group\u modify
中的新函数对组应用函数
df <- data.frame(
ID = c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4),
D = c(1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0)
)
df%group\u by(ID)%%>%group\u修改(
函数(x,y){
boo您可以使用dplyrdplyr::group\u modify
中的新函数在组上应用函数
df <- data.frame(
ID = c(1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4),
D = c(1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0)
)
df%group\u by(ID)%%>%group\u修改(
函数(x,y){
boo这个呢:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(prev = +(cumsum(c(0, D[-length(D)])) > 0)) %>%
ungroup()
#> # A tibble: 14 x 3
#> ID D prev
#> <int> <int> <int>
#> 1 1 1 0
#> 2 1 0 1
#> 3 1 0 1
#> 4 2 0 0
#> 5 2 0 0
#> 6 3 1 0
#> 7 3 0 1
#> 8 3 0 1
#> 9 4 1 0
#> 10 4 0 1
#> 11 4 1 1
#> 12 4 1 1
#> 13 4 1 1
#> 14 4 0 1
在x
cumsum(x)
#> [1] 0 0 0 1 2 2 2 4 7 11
+(cumsum(c(0,x))>0)
#> [1] 0 0 0 0 1 1 1 1 1 1 1
您只对零以上的值感兴趣,因此:
cumsum(x)>0
#> [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
你不需要逻辑,只需要数字。只要一个+
就可以了
+(cumsum(x)>0)
#> [1] 0 0 0 1 1 1 1 1 1 1
但是,您希望1s延迟1。因此,我们在x
cumsum(x)
#> [1] 0 0 0 1 2 2 2 4 7 11
+(cumsum(c(0,x))>0)
#> [1] 0 0 0 0 1 1 1 1 1 1 1
我们需要保持相同的长度,因此删除x
的最后一个值
+(cumsum(c(0, x[-length(x)])) > 0)
#> [1] 0 0 0 0 1 1 1 1 1 1
这就是诀窍。这个呢:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(prev = +(cumsum(c(0, D[-length(D)])) > 0)) %>%
ungroup()
#> # A tibble: 14 x 3
#> ID D prev
#> <int> <int> <int>
#> 1 1 1 0
#> 2 1 0 1
#> 3 1 0 1
#> 4 2 0 0
#> 5 2 0 0
#> 6 3 1 0
#> 7 3 0 1
#> 8 3 0 1
#> 9 4 1 0
#> 10 4 0 1
#> 11 4 1 1
#> 12 4 1 1
#> 13 4 1 1
#> 14 4 0 1
在x
cumsum(x)
#> [1] 0 0 0 1 2 2 2 4 7 11
+(cumsum(c(0,x))>0)
#> [1] 0 0 0 0 1 1 1 1 1 1 1
您只对零以上的值感兴趣,因此:
cumsum(x)>0
#> [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
你不需要逻辑,只需要数字。只要一个+
就可以了
+(cumsum(x)>0)
#> [1] 0 0 0 1 1 1 1 1 1 1
但是,您希望1s延迟1。因此,我们在x
cumsum(x)
#> [1] 0 0 0 1 2 2 2 4 7 11
+(cumsum(c(0,x))>0)
#> [1] 0 0 0 0 1 1 1 1 1 1 1
我们需要保持相同的长度,因此删除x
的最后一个值
+(cumsum(c(0, x[-length(x)])) > 0)
#> [1] 0 0 0 0 1 1 1 1 1 1
这就是诀窍。我们可以使用lag
library(dplyr)
df %>%
group_by(ID) %>%
mutate(prev = lag(cumsum(D) > 0, default = 0))
-输出
# A tibble: 14 x 3
# Groups: ID [4]
# ID D prev
# <dbl> <dbl> <dbl>
# 1 1 1 0
# 2 1 0 1
# 3 1 0 1
# 4 2 0 0
# 5 2 0 0
# 6 3 1 0
# 7 3 0 1
# 8 3 0 1
# 9 4 1 0
#10 4 0 1
#11 4 1 1
#12 4 1 1
#13 4 1 1
#14 4 0 1
#一个tible:14 x 3
#组别:ID[4]
#ID D上一个
#
# 1 1 1 0
# 2 1 0 1
# 3 1 0 1
# 4 2 0 0
# 5 2 0 0
# 6 3 1 0
# 7 3 0 1
# 8 3 0 1
# 9 4 1 0
#10 4 0 1
#11 4 1 1
#12 4 1 1
#13 4 1 1
#14 4 0 1
数据
df我们可以使用lag
library(dplyr)
df %>%
group_by(ID) %>%
mutate(prev = lag(cumsum(D) > 0, default = 0))
-输出
# A tibble: 14 x 3
# Groups: ID [4]
# ID D prev
# <dbl> <dbl> <dbl>
# 1 1 1 0
# 2 1 0 1
# 3 1 0 1
# 4 2 0 0
# 5 2 0 0
# 6 3 1 0
# 7 3 0 1
# 8 3 0 1
# 9 4 1 0
#10 4 0 1
#11 4 1 1
#12 4 1 1
#13 4 1 1
#14 4 0 1
#一个tible:14 x 3
#组别:ID[4]
#ID D上一个
#
# 1 1 1 0
# 2 1 0 1
# 3 1 0 1
# 4 2 0 0
# 5 2 0 0
# 6 3 1 0
# 7 3 0 1
# 8 3 0 1
# 9 4 1 0
#10 4 0 1
#11 4 1 1
#12 4 1 1
#13 4 1 1
#14 4 0 1
数据
df这是有效的!这是如何达到我的目的的?我添加了一个编辑来解释它的作用。我做了一个小编辑。。但是,@akrun解决方案更好。你应该使用该代码!:-)这是有效的!这是如何达到我的目的的?我添加了一个编辑来解释它的作用。我做了一个小编辑。。但是,@akrun solution更好。你应该使用该代码!:-)