代码之家  ›  专栏  ›  技术社区  ›  S31

如果一行满足条件,则dpylr中的所有行都将发生更改。

  •  0
  • S31  · 技术社区  · 8 年前

    快速问题,如果另一列中的一行符合dpylr中的某个条件,如何更改一列中的所有行?

    所以,不同的例子:

    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,则新列“two”将全部为1。如果“一”列中没有1,但有0,则“二”将全部为0。如果没有1或0,则“二”将全部为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
    

    不需要是一个循环,因为不会有很多这样的情况,只需要一个一行就可以了。我觉得我在dpylr中缺少if(match())等价物

    1 回复  |  直到 8 年前
        1
  •  2
  •   cderv    8 年前

    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
    

    创建于2018-07-08 reprex package (v0.2.0版)。