создание нескольких новых переменных из средств, используя grep или str_which в tidyverse - PullRequest
0 голосов
/ 04 мая 2020

У меня есть набор данных с несколькими анкетами. В приведенном ниже примере var будет одним вопросником, а оценка - другим.

var_1 <- c(1, 2, 3, 4, 5)
var_2 <- c(5, 4, 3, 2, 1)
score_1 <- c(3, 1, 5, 2, 4)
score_2 <- c(2, 4, 1, 5, 3)

dat <- data.frame(var_1, var_2, score_1, score_2)

Используя tidyverse, я хочу создать новые переменные, которые рассчитываются на основе среднего значения каждого вопросника. Я пробовал оба следующих синтаксиса:

dat %>%
  var <- rowMeans(grep("var", names(dat))) %>%
  score <- rowMeans(grep("score", names(dat)))
dat %>%
  var <- rowMeans(str_which(names(dat), "var")) %>%
  score <- rowMeans(str_which(names(dat), "score"))

Однако оба возвращают одну и ту же ошибку

Error in rowMeans(grep("var", names(dat))) : 
  'x' must be an array of at least two dimensions

Но когда я использую grep в Base R со следующим синтаксисом, grep работает нормально.

dat$var <- rowMeans(dat[grep("var", names(dat))])
dat$score <- rowMeans(dat[grep("score", names(dat))])

Однако, поскольку у меня несколько анкет, набирать приведенный выше синтаксис для каждой анкеты утомительно. Есть ли способ, которым я могу использовать канал с grep или str_which для создания моих переменных?

1 Ответ

1 голос
/ 04 мая 2020

Вы должны поместить их в mutate:

library(dplyr)
dat %>%
  mutate(var = rowMeans(.[grep("var", names(.))]),
         score = rowMeans(.[grep("score", names(.))]))

Поскольку у вас есть несколько таких вопросников, лучше использовать split.default, который разбивает столбцы на основе общей части в их имя столбца, а затем принять среднее по строке.

cbind(dat, sapply(split.default(dat, sub('_.*', '', names(dat))), rowMeans))


#  var_1 var_2 score_1 score_2 score var
#1     1     5       3       2   2.5   3
#2     2     4       1       4   2.5   3
#3     3     3       5       1   3.0   3
#4     4     2       2       5   3.5   3
#5     5     1       4       3   3.5   3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...