用另一列的值填充整个新列,直到达到另一列值的行

Fill whole new column with value of another column until the row of the value of another column is reached

对此进行跟进

相同的数据帧,现在有更多行:

df1 <- data.frame(
  colA = c("pass", "pass", "pass", "pass", "pass", "sub", "pass", "pass", "pass", "pass"),
  colB = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
  colC = ""
)

# Output1
   colA colB colC
1  pass    0     
2  pass    0     
3  pass    0     
4  pass    0     
5  pass    0     
6   sub    1     
7  pass    0     
8  pass    0     
9  pass    0     
10 pass    0  

df2 <- data.frame(
  colA = c("pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass"),
  colB = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
  colC = "" 
)

# Output2
   colA colB colC
1  pass    0     
2  pass    0     
3  pass    0     
4  pass    0     
5  pass    0     
6  pass    0     
7  pass    0     
8  pass    0     
9  pass    0     
10 pass    0 

根据上一个问题,colC returns 所有 1 个值,这就是我要求的。

df1 %>% 
  mutate(colC = case_when("sub" %in% colA ~ 1,
                          TRUE ~ 0))

# Output
   colA colB colC
1  pass    0    1
2  pass    0    1
3  pass    0    1
4  pass    0    1
5  pass    0    1
6   sub    1    1
7  pass    0    1
8  pass    0    1
9  pass    0    1
10 pass    0    1

现在我想执行以下操作:colC 值应为 1,直到发生 sub 的行,该列的其余部分应为 0:

# Output1
   colA colB colC
1  pass    0    1 
2  pass    0    1
3  pass    0    1
4  pass    0    1
5  pass    0    1
6   sub    1    1
7  pass    0    0
8  pass    0    0
9  pass    0    0
10 pass    0    0

这将如何运作?

您可以使用 match :

library(dplyr)

df1 %>%
  mutate(colC = as.integer(row_number() <= match('sub', colA, nomatch = 0)))

#   colA colB colC
#1  pass    0    1
#2  pass    0    1
#3  pass    0    1
#4  pass    0    1
#5  pass    0    1
#6   sub    1    1
#7  pass    0    0
#8  pass    0    0
#9  pass    0    0
#10 pass    0    0

df2 :

df2 %>% 
  mutate(colC = as.integer(row_number() <= match('sub', colA, nomatch = 0)))

#   colA colB colC
#1  pass    0    0
#2  pass    0    0
#3  pass    0    0
#4  pass    0    0
#5  pass    0    0
#6  pass    0    0
#7  pass    0    0
#8  pass    0    0
#9  pass    0    0
#10 pass    0    0

如评论所述,可能有2个subs,所以试试这个

df1 <- data.frame(
  colA = c("pass", "pass", "pass", "pass", "pass", "sub", "pass", "pass", "sub", "pass"),
  colB = c(0, 0, 0, 0, 0, 1, 0, 0, 1, 0)
)

transform(df1, colC = +(as.logical(rev(cumsum(rev(colA == 'sub'))))))
#>    colA colB colC
#> 1  pass    0    1
#> 2  pass    0    1
#> 3  pass    0    1
#> 4  pass    0    1
#> 5  pass    0    1
#> 6   sub    1    1
#> 7  pass    0    1
#> 8  pass    0    1
#> 9   sub    1    1
#> 10 pass    0    0

reprex package (v2.0.0)

于 2021-05-19 创建