#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, мне нравится решение «труба в трубе»! Я не знал о такой возможности ! потрясающий трюк