map_dfr: заполнить столбец .id строковыми метками вместо индексов без имени .x - PullRequest
0 голосов
/ 13 мая 2018

Я хочу пометить записи столбца .id в выводе map_dfr словами вместо значений индекса, но мой ввод не назван (то есть как map принимает строковые значения для .id).

Какой лучший способ сопоставить имена в поле .id в этом случае?

Пример данных:

n <- 20
df <- data.frame(foo_1=rnorm(n), foo_2=rnorm(n), foo_3=rnorm(n), 
                 foo_a=runif(n), t_foo=runif(n),
                 bar_1=rnorm(n), bar_2=rnorm(n), bar_3=rnorm(n), 
                 bar_a=runif(n), t_bar=runif(n))

Оба foo и bar являютсяпсихометрические шкалы, и я хочу измерить надежность для каждой шкалы, используя psych::alpha().
Единственные релевантные столбцы имеют шаблон именования foo_<int> (для foo шкалы) или bar_<int> для *Шкала 1022 * (отсюда и соответствие регулярному выражению ниже).

На самом деле у меня много шкал и много столбцов, составляющих каждую шкалу.Поэтому я подумал, что map может быть хорошим способом выполнения вычислений, что-то вроде этого:

require(psych)
require(tidyverse)

categories <- c("foo", "bar")

categories %>%
  map_dfr(~df %>% 
            select(matches(paste0("^",.x,"_?\\d"))) %>% 
            do(psych::alpha(., check.keys=TRUE)$total), .id="scale") %>%
  select(scale, raw_alpha, std.alpha)

  scale raw_alpha std.alpha
1     1 0.2275679 0.2791238
2     2 0.4141225 0.4130054

Но я хочу, чтобы scale принял значения foo и bar:

  scale raw_alpha std.alpha
1   foo 0.2275679 0.2791238
2   bar 0.4141225 0.4130054

В этом примере с игрушкой было бы неплохо просто вручную создать categories <- c(foo="foo", bar="bar"), но со многими масштабами, которые требуют слишком больших усилий.

Одна мысль, которая у меня возникла, заключалась в том, чтобы автоматизировать подход foo="foo" с помощью чего-то вроде zip из Python, чтобы создать вектор пар ключ-значение, например, c(scale_name="scale_name",...), но я не знаю, как это сделать.сделать это в R. И в любом случае, этот подход не очень хорош (хотя я бы с радостью согласился на просто функциональность).

Любые предложения о том, как наилучшим образом получить выходной формат, который я ищу

1 Ответ

0 голосов
/ 13 мая 2018

Если я не пропущу что-то более сложное с проблемой, это легко исправить. Вы можете просто добавить mutate внутри map_dfr, поэтому вы создаете столбец на основе значения, переданного в map_dfr. Вы можете просто сбросить бит .id и использовать вызов mutate для создания столбца scale; Я просто хотел показать scale и scale_cat рядом.

library(tidyverse)

set.seed(123)
n <- 20
df <- data.frame(foo_1=rnorm(n), foo_2=rnorm(n), foo_3=rnorm(n), 
                                 foo_a=runif(n), t_foo=runif(n),
                                 bar_1=rnorm(n), bar_2=rnorm(n), bar_3=rnorm(n), 
                                 bar_a=runif(n), t_bar=runif(n))

categories <- c("foo", "bar")

categories %>%
    map_dfr(~df %>% 
                        select(matches(paste0("^",.x,"_?\\d"))) %>% 
                        do(psych::alpha(., check.keys=TRUE)$total) %>%
                        mutate(scale_cat = .x), 
                    .id="scale") %>%
    select(scale, scale_cat, raw_alpha, std.alpha)
#>   scale scale_cat raw_alpha std.alpha
#> 1     1       foo 0.2606448 0.2601066
#> 2     2       bar 0.4571981 0.4827263

Создано в 2018-05-12 пакетом Представ (v0.2.0).

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