我有一个数据框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()
由于某种原因而获得了完整的专栏。我想念的是什么?如何才能达到预期的效果?
答案 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)