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

时间:2018-10-04 19:13:43

标签: r dplyr mutate any

我有一个数据框jj:

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

我想创建第三列,如果具有特定a的任何行中的b == TRUE则为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()由于某种原因而获得了完整的专栏。我想念的是什么?如何才能达到预期的效果?

1 个答案:

答案 0 :(得分:2)

我们需要在逻辑列上应用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 

rhs的{​​{1}}表达式只有在表达式&&都为真时才会被评估

此处,lhs等于1不正确,因此它返回length(x)