用另一列的值填充整个新列,直到达到另一列值的行
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 创建
对此进行跟进
相同的数据帧,现在有更多行:
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 创建