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

如何基于分组data.frame中另一列的any()填充列?

  •  1
  • iod  · 技术社区  · 6 年前

    我有一个数据帧jj:

    jj<-data.frame(a=rep(1:3,3),b=c(TRUE,rep(FALSE,4),TRUE,TRUE,FALSE,TRUE))
    

    我想创建一个第三列,如果其中任何一行具有特定的 a b==真。所以我试了这个:

    group_by(jj,a) %>% mutate(c=any(isTRUE(b)))
    

    # A tibble: 9 x 3
    # Groups:   a [3]
          a b     c    
      <int> <lgl> <lgl>
    1     1 TRUE  FALSE
    2     2 FALSE FALSE
    3     3 FALSE FALSE
    4     1 FALSE FALSE
    5     2 FALSE FALSE
    6     3 TRUE  FALSE
    7     1 TRUE  FALSE
    8     2 FALSE FALSE
    9     3 TRUE  FALSE
    

    我的预期结果应该是:

    # A tibble: 9 x 3
    # Groups:   a [3]
          a b     c    
      <int> <lgl> <lgl>
    1     1 TRUE  TRUE
    2     2 FALSE FALSE
    3     3 FALSE TRUE
    4     1 FALSE TRUE
    5     2 FALSE FALSE
    6     3 TRUE  TRUE
    7     1 TRUE  TRUE
    8     2 FALSE FALSE
    9     3 TRUE  TRUE
    

    我甚至不明白为什么我会得到所有的错误——如果这都是真的,我会这么想 any()

    1 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    我们需要申请 any 在逻辑列上,而不是 isTRUE

    jj %>% 
      group_by(a) %>%
      mutate(c = any(b))
    # A tibble: 9 x 3
    # Groups:   a [3]
    #      a b     c    
    #  <int> <lgl> <lgl>
    #1     1 TRUE  TRUE 
    #2     2 FALSE FALSE
    #3     3 FALSE TRUE 
    #4     1 FALSE TRUE 
    #5     2 FALSE FALSE
    #6     3 TRUE  TRUE 
    #7     1 TRUE  TRUE 
    #8     2 FALSE FALSE
    #9     3 TRUE  TRUE 
    

    否则(从 ?isTRUE )

    is.logical(x) && length(x) == 1 && !is.na(x) && x 
    

    这个 rhs 表达 && 仅当表达式 lhs 都是真的

    这里,那个 length(x) 等于1是不正确的,所以它返回 FALSE

    推荐文章