快速的问题,如果另一列中的某一行符合dplyr中的特定条件,该如何更改一列的所有行?
因此,不同的示例:
df <- data.frame(one = c(1,0,1,NA,1))
df2 <- data.frame(one = c(0,0,0,NA,0))
df3 <- data.frame(one = c(NA,NA,NA,NA,NA))
如果数据中有1,则新列“二”将全为1。如果“一”列中没有1,但是有一个0,则“二”将全部为0。如果不存在1或0,则“ 2”将全部为NA。
因此在这种情况下的结果将是:
df
one two
1 1
0 1
1 1
NA 1
1 1
df
one two
0 0
0 0
0 0
NA 0
0 0
df
one two
NA NA
NA NA
NA NA
NA NA
NA NA
不需要循环,因为不会出现很多情况,只需要一个衬套就可以了。我觉得我想念dplyr中的if(match())等价物
答案 0 :(得分:2)
对于dplyr
,对于这种情况,您可以使用case_when
。它按顺序应用条件,并且条件可以基于其他列。查看示例。
df <- data.frame(one = c(1,0,1,NA,1))
df2 <- data.frame(one = c(0,0,0,NA,0))
df3 <- data.frame(one = c(NA,NA,NA,NA,NA))
library(dplyr, warn.conflicts = FALSE)
df %>%
mutate(two = case_when(
# if any 1 in one then two == 1
any(one == 1) ~ 1L,
# if no 1 in one, but some 0, then two = 0
any(one == 0) ~ 0L,
# in any other cases, two = NA
TRUE ~ NA_integer_
))
#> one two
#> 1 1 1
#> 2 0 1
#> 3 1 1
#> 4 NA 1
#> 5 1 1
df2 %>%
mutate(two = case_when(
any(one == 1) ~ 1L,
any(one == 0) ~ 0L,
TRUE ~ NA_integer_
))
#> one two
#> 1 0 0
#> 2 0 0
#> 3 0 0
#> 4 NA 0
#> 5 0 0
df3 %>%
mutate(two = case_when(
any(one == 1) ~ 1L,
any(one == 0) ~ 0L,
TRUE ~ NA_integer_
))
#> one two
#> 1 NA NA
#> 2 NA NA
#> 3 NA NA
#> 4 NA NA
#> 5 NA NA
由reprex package(v0.2.0)于2018-07-08创建。