如果一行满足条件,则所有行都在dplyr中更改

时间:2018-07-08 20:04:50

标签: r dplyr

快速的问题,如果另一列中的某一行符合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())等价物

1 个答案:

答案 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创建。