2017-02-03 5 views
3

Например, у меня есть фрейм данных, где я хочу получить сумму всех столбцов, начинающихся с «Q3», я мог бы печатать каждый из них, но было бы замечательно, если бы можно было сделать что-то вроде этого:Есть ли способ использовать вспомогательные функции `dplyr` в мутате?

#Example data 
test <- structure(list(UserID = c("53017366", "53017366"), Q3_1 = c(3L, 
3L), Q3_2 = c(2L, 2L), Q3_3 = c(3L, 3L), Q3_4 = c(NA, 5L)), class = "data.frame", row.names = c(NA, -2L), .Names = c("UserID", "Q3_1", "Q3_2", "Q3_3", "Q3_4")) 

#what I'd like to see, but doesn't work 
test %>% mutate(total = sum(starts_with("Q3"), na.rm = TRUE)) 

#What I'd like to end up with: 
    UserID Q3_1 Q3_2 Q3_3 Q3_4 total 
1 53017366 3 2 3 NA  8 
2 53017366 3 2 3 5 13 

Один вариант, предложенный here и here, требует ввода всего нового столбца выбора в данные и использования функции rollise (например, rowSums).

ответ

4

Мы можем использовать rowSums

test %>% 
    mutate(total = rowSums(.[grep("Q3", names(.))], na.rm =TRUE)) 
# UserID Q3_1 Q3_2 Q3_3 Q3_4 total 
#1 53017366 3 2 3 NA  8 
#2 53017366 3 2 3 5 13 
+2

Нечто подобное, полученное из вашего ответа, также работает. Спасибо: 'test%>% mutate (total = rowSums (. [Start_with (" Q3 ", vars = names (.))], Na.rm = TRUE))' –

+0

И в этом случае я думаю об общих показателях и некоторые подшкалы (хотя я не уверен, что буду использовать). Я могу добавить '[1: 3]' к выбору для подмножества вещей легко. Кажется, это довольно простой способ сделать это, но если есть лучший способ, мне было бы интересно учиться. –

1

В этом случае вы можете использовать janitor::add_totals_col:

library(janitor) 
test %>% 
    add_totals_col() 
#>  UserID Q3_1 Q3_2 Q3_3 Q3_4 Total 
#> 1 53017366 3 2 3 NA  8 
#> 2 53017366 3 2 3 5 13 

Для вашего глубокого вопроса о необходимости использования select помощников в мутируете здесь, эта потребность может указывать основополагающую недостаток tidy data структура. В этом случае у вас есть значения в заголовках столбцов. В более длинном порядке, скажем, с переменной quarter, вы можете сделать это элегантно с group_by и summarise.

+0

Не знал, что функция. Спасибо за предоставление – akrun

+0

Спасибо за предложение. Это небольшая часть данных опроса, поэтому в колонках есть разные вопросы. Он продолжает работать с Q3_5 и т. Д., Но в итоге попадает Q4_1, Q4_2, ... Наличие большого набора данных для меня неинтуитивно, но я предполагаю, что он может включать столбец для набора вопросов и один для какого вопроса он было, то значение. –