【问题标题】:How to populate a column based on any() in another column in a grouped data.frame?如何根据分组 data.frame 中另一列中的 any() 填充列?
【发布时间】:2018-10-04 19:13:43
【问题描述】:

我有一个数据框 jj:

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

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

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

我什至不明白为什么我得到的都是 FALSE —— 如果它都是 TRUE 就有意义了,我认为 any() 出于某种原因获得了完整的专栏。我缺少什么,我怎样才能达到预期的效果?

【问题讨论】:

    标签: r dplyr any


    【解决方案1】:

    我们需要在逻辑列上应用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是另外一种情况(来自?isTRUE

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

    &amp;&amp;rhs 表达式只有在表达式 lhs 全部为真时才会被计算

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2020-11-26
      • 1970-01-01
      • 2021-03-16
      • 2020-02-17
      • 1970-01-01
      相关资源
      最近更新 更多