Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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
如何使用dplyr通过分组变量循环ifelse函数_R_Dplyr - Fatal编程技术网

如何使用dplyr通过分组变量循环ifelse函数

如何使用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应用一个规则,在第一个实例中,一行中某个变量的值等于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您可以使用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这个呢:

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更好。你应该使用该代码!:-)