Как заполнить столбец на основе any () в другом столбце сгруппированного data.frame? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть фрейм данных 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

Я надеваюЯ даже не понимаю, почему я получаю ЛОЖЬ - это имело бы смысл, если бы все было ИСТИНА, и я бы подумал, что any() по какой-то причине получает полный столбец.Чего мне не хватает, и как мне достичь желаемого результата?

1 Ответ

0 голосов
/ 04 октября 2018

Нам нужно применить 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 выражение && будет оценено, только если выражение lhs все верно

здесь, length(x), равное 1, неверно, поэтому оно возвращает FALSE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...