Построчная сумма логических значений во фрейме данных

#r #dplyr

Вопрос:

У меня есть такой фрейм данных (с большим количеством переменных)

 tb = data.frame(ID=c("a","b","c"),V1=c(TRUE,FALSE,TRUE),
                V2=c(FALSE,FALSE,TRUE),V3=c(TRUE,TRUE,FALSE) )
tb 

  ID    V1    V2    V3
1  a  TRUE FALSE  TRUE
2  b FALSE FALSE  TRUE
3  c  TRUE  TRUE FALSE
 

Мне нужно добавить четвертую переменную с суммой истинных значений по строкам
, как это, но с сохранением всех остальных переменных

 tb %>%
 select(V1:V3) %>%
 mutate(out = rowSums(.))

     V1    V2    V3 out
1  TRUE FALSE  TRUE   2
2 FALSE FALSE  TRUE   1
3  TRUE  TRUE FALSE   2
 

Комментарии:

1. Попробуй tb %>% mutate(res = rowSums(.[-1]))

Ответ №1:

Решение dplyr

В одном вызове вы можете использовать помощник выбора where внутри across , чтобы передавать только столбцы, которые соответствуют условию ( is.logical ) rowSums .

 tb %>% mutate(sum = rowSums(across(where(is.logical))))

  ID    V1    V2    V3 sum
1  a  TRUE FALSE  TRUE   2
2  b FALSE FALSE  TRUE   1
3  c  TRUE  TRUE FALSE   2
 

Вы также можете выбрать столбцы по имени внутри поперек или с шаблонами имен с starts_with или matches :

 tb %>% mutate(sum = rowSums(across(V1:V3)))
#OR
tb %>% mutate(sum = rowSums(across(starts_with("V"))))
#OR
tb %>% mutate(sum = rowSums(across(matches("V\d"))))
 

Ответ №2:

Может быть, не dplyr так, но вы могли бы использовать select() внутри mutate() вот так:

 tb %>% mutate(out = rowSums(tb %>% select(V1:V3)))


  ID    V1    V2    V3 out
1  a  TRUE FALSE  TRUE   2
2  b FALSE FALSE  TRUE   1
3  c  TRUE  TRUE FALSE   2
 

Комментарии:

1. Считалось ли это TRUE 1? Хорошо, что я этого не знал.

2. @sindri_baldur, мне нравится решение «труба в трубе»! Я не знал о такой возможности ! потрясающий трюк