Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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:在突变本身中使用由mutate创建的列_R_Dplyr - Fatal编程技术网

dplyr:在突变本身中使用由mutate创建的列

dplyr:在突变本身中使用由mutate创建的列,r,dplyr,R,Dplyr,我有一个数据框,看起来像这样: > df # A tibble: 5,427 x 3 cond desired inc <chr> <dbl> <dbl> 1 <NA> 0 0 2 <NA> 5 5 3 X 10 5 4 X 7 7 5 <NA> 16 16 6 <

我有一个数据框,看起来像这样:

> df
# A tibble: 5,427 x 3
    cond desired   inc
   <chr>   <dbl> <dbl>
 1  <NA>       0     0
 2  <NA>       5     5
 3     X      10     5
 4     X       7     7
 5  <NA>      16    16
 6  <NA>      21     5
 7  <NA>      26     5
 8  <NA>      31     5
 9     X      37     6
10  <NA>       5     5
> df
# A tibble: 5,427 x 4
    cond desired   inc  test
   <chr>   <dbl> <dbl> <dbl>
 1  <NA>       0     0    NA
 2  <NA>       5     5    NA
 3     X      10     5    10
 4     X       7     7     7
 5  <NA>      16    16    16
 6  <NA>      21     5    21
 7  <NA>      26     5    10
 8  <NA>      31     5    10
 9     X      37     6    11
10  <NA>       5     5     5
# ... with 5,417 more rows
如果我得到以下信息后运行第二行:

> df
# A tibble: 5,427 x 4
    cond desired   inc  test
   <chr>   <dbl> <dbl> <dbl>
 1  <NA>       0     0    NA
 2  <NA>       5     5     5
 3     X      10     5     5
 4     X       7     7     7
 5  <NA>      16    16    16
 6  <NA>      21     5     5
 7  <NA>      26     5     5
 8  <NA>      31     5     5
 9     X      37     6     6
10  <NA>       5     5     5

下面是一个使用
ave()
函数和上面的df结构的示例。为了清晰起见,我展示了所有步骤,但如果需要,可以减少这些步骤

library(dplyr)
df %>% 
  mutate(prevcond = lag(cond)) %>%
  mutate(flag = ifelse(is.na(prevcond) | prevcond !='X', 0, 1)) %>% 
  mutate(counter = cumsum(flag)) %>% 
  mutate(desired2 = ave(inc, counter, FUN = cumsum))

下面是一个使用
ave()
函数和上面的df结构的示例。为了清晰起见,我展示了所有步骤,但如果需要,可以减少这些步骤

library(dplyr)
df %>% 
  mutate(prevcond = lag(cond)) %>%
  mutate(flag = ifelse(is.na(prevcond) | prevcond !='X', 0, 1)) %>% 
  mutate(counter = cumsum(flag)) %>% 
  mutate(desired2 = ave(inc, counter, FUN = cumsum))

为了获得所需的输出,我们必须首先创建一个分组列,每当上一行等于
X
时,该列就会重置。为此,我们将
row\u number()
zoo::na.locf()
结合使用。然后我们可以简单地使用
cumsum()

库(dplyr)
图书馆(动物园)
df%>%分组依据(grp=na.locf(第二排),
fromLast=TRUE,
na.rm=FALSE))%>%
突变(测试=累积(inc))
#cond预期inc grp试验
#         
# 1         0     0     1     0
# 2         5     5     1     5
#3 X 10 5 1 10
#4 X 7 2 7
# 5        16    16     3    16
# 6        21     5     3    21
# 7        26     5     3    26
# 8        31     5     3    31
#9 X 37 6 3 37
#10         5     5     4     5

要获得所需的输出,我们必须首先创建一个分组列,每当上一行等于
X
时,该列就会重置。为此,我们将
row\u number()
zoo::na.locf()
结合使用。然后我们可以简单地使用
cumsum()

库(dplyr)
图书馆(动物园)
df%>%分组依据(grp=na.locf(第二排),
fromLast=TRUE,
na.rm=FALSE))%>%
突变(测试=累积(inc))
#cond预期inc grp试验
#         
# 1         0     0     1     0
# 2         5     5     1     5
#3 X 10 5 1 10
#4 X 7 2 7
# 5        16    16     3    16
# 6        21     5     3    21
# 7        26     5     3    26
# 8        31     5     3    31
#9 X 37 6 3 37
#10         5     5     4     5

cond
列是
x
甚至在第
9行中。因此,根据您规定的规则,金额也应设置在此处。为什么行
9
与行
3
4
不同?X影响下一行,因此行9中的X重置总和,行10中的inc成为总和。第3行和第4行也是如此:在第4行和第5行中,所需的与该行的inc相同。
cond
列是
x
,即使在第
9行中也是如此。因此,根据您规定的规则,金额也应设置在此处。为什么行
9
与行
3
4
不同?X影响下一行,因此行9中的X重置总和,行10中的inc成为总和。第3行和第4行也是如此:在第4行和第5行中,所需的与该行的inc相同。
> df
# A tibble: 5,427 x 4
    cond desired   inc  test
   <chr>   <dbl> <dbl> <dbl>
 1  <NA>       0     0    NA
 2  <NA>       5     5    NA
 3     X      10     5    NA
 4     X       7     7     7
 5  <NA>      16    16    16
 6  <NA>      21     5    21
 7  <NA>      26     5    26
 8  <NA>      31     5    31
 9     X      37     6    37
10  <NA>       5     5     5
structure(list(cond = c(NA, NA, "X", "X", NA, NA, NA, NA, "X", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, "X", 
NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, "X", NA, NA, "X", 
NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, "X", NA, 
NA, NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, 
NA, "X", NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, 
NA, NA, NA, "X", NA, NA, NA, "X", NA, NA, NA, NA, "X", NA, NA, 
NA, NA, NA, NA, NA, NA, "X", NA, NA, "X", NA, NA, NA, NA, "X", 
NA, NA, NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, 
NA, "X", NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, "X", NA, NA, 
NA, NA, NA, NA, NA, "X", NA, NA, NA, "X", "X", NA, NA, NA, NA, 
NA, NA, NA, NA, "X", "X", NA, "X", NA, NA, NA, NA, NA, NA, NA, 
NA, "X", NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, "X", 
NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, "X", NA, NA, NA, NA, 
"X", NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, 
"X", NA, NA, NA, NA, NA, NA, "X", NA, NA, NA, NA, "X", NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "X", NA, "X", 
NA, "X", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, "X", NA, NA, NA), desired = c(0, 5, 10, 7, 16, 21, 26, 
31, 37, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 5, 10, 15, 20, 
30, 7, 15, 21, 25, 40, 45, 55, 12, 20, 25, 30, 35, 40, 45, 50, 
55, 60, 65, 70, 75, 5, 10, 15, 20, 22, 30, 35, 45, 50, 55, 60, 
65, 70, 75, 9, 14, 19, 24, 29, 34, 39, 44, 5, 7, 10, 2, 7, 12, 
17, 22, 27, 5, 10, 15, 20, 25, 30, 35, 38, 4, 7, 12, 17, 22, 
27, 32, 37, 39, 13, 18, 23, 28, 33, 38, 43, 48, 53, 5, 10, 15, 
20, 25, 30, 35, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 5, 10, 
15, 20, 2, 10, 15, 20, 25, 5, 10, 15, 20, 25, 30, 35, 40, 45, 
5, 8, 12, 5, 10, 14, 19, 24, 5, 10, 15, 20, 25, 30, 35, 40, 45, 
5, 10, 15, 20, 25, 28, 33, 38, 5, 11, 5, 10, 15, 20, 25, 30, 
35, 40, 45, 12, 17, 22, 27, 32, 37, 42, 47, 5, 10, 15, 20, 5, 
5, 10, 15, 20, 25, 30, 35, 40, 45, 5, 5, 10, 5, 10, 15, 20, 25, 
30, 35, 40, 45, 5, 10, 15, 20, 5, 10, 15, 20, 25, 30, 34, 39, 
44, 5, 10, 15, 20, 25, 30, 5, 10, 15, 20, 25, 5, 10, 15, 20, 
25, 5, 10, 15, 20, 25, 29, 5, 10, 15, 20, 23, 25, 30, 35, 40, 
5, 15, 20, 25, 30, 35, 40, 5, 10, 15, 20, 25, 5, 10, 15, 20, 
25, 28, 33, 38, 43, 48, 53, 58, 71, 76, 81, 5, 10, 5, 10, 5, 
10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 5, 
10, 15), inc = c(0, 5, 5, 7, 16, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 10, 7, 8, 6, 4, 15, 5, 10, 12, 8, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 8, 5, 10, 5, 5, 
5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 2, 3, 2, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 3, 4, 3, 5, 5, 5, 5, 5, 5, 2, 13, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 2, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
3, 4, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
3, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 
5, 5, 5, 5, 3, 2, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 13, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5)), .Names = c("cond", 
"desired", "inc"), row.names = c(NA, -300L), class = c("tbl_df", 
"tbl", "data.frame"))
library(dplyr)
df %>% 
  mutate(prevcond = lag(cond)) %>%
  mutate(flag = ifelse(is.na(prevcond) | prevcond !='X', 0, 1)) %>% 
  mutate(counter = cumsum(flag)) %>% 
  mutate(desired2 = ave(inc, counter, FUN = cumsum))
library(dplyr)
library(zoo)
df %>% group_by(grp = na.locf(row_number(cond), 
                              fromLast = TRUE, 
                              na.rm = FALSE)) %>%
  mutate(test = cumsum(inc))
#    cond desired   inc   grp  test
#   <chr>   <dbl> <dbl> <int> <dbl>
# 1  <NA>       0     0     1     0
# 2  <NA>       5     5     1     5
# 3     X      10     5     1    10
# 4     X       7     7     2     7
# 5  <NA>      16    16     3    16
# 6  <NA>      21     5     3    21
# 7  <NA>      26     5     3    26
# 8  <NA>      31     5     3    31
# 9     X      37     6     3    37
#10  <NA>       5     5     4     5