Как добавить новые переменные с похожими именами во фрейм данных, используя условные операторы других? - PullRequest
1 голос
/ 22 марта 2019

Hy Everyone,

Я использовал для очистки данных с помощью SPSS и пытаюсь перейти на R.

У меня есть фрейм данных с историями рождения женщин за несколько лет, и янужно создавать и добавлять новые переменные, используя их.В основном, у меня есть переменные для каждого года от pa2010 до pa1996, которые представляют собой количество детей, которые женщина имела в начале года.Эти переменные являются числовыми, и я хочу преобразовать другие переменные с именами ppa2010 в ppa1996 как факторы и в то же время определить уровни и метки.Я сделал все это один раз, но я набрал каждую переменную и каждое условие.В последние дни я пытался вставить циклы, чтобы сделать мой код лучше, но безуспешно.

pa2010 <- c(0, 0, 2, 5, 3, 6, 8, 2, 1, 1)
pa2009 <- c(0, 0, 2, 4, 3, 6, 8 ,2, 0, 0)
pa2008 <- c(0, 0, 1, 4, 3, 5, 8, 1, 0, 0)

Parity <- data.frame(pa2010, pa2009, pa2008)

##I've been creating like this... 
Parity %>% mutate(ppa2010 = ifelse(pa2010 >= 7, 7, pa2010),
                  ppa2009 = ifelse(pa2009 >= 7, 7, pa2009),
                  ppa2008 = ifelse(pa2008 >= 7, 7, pa2008)) %>% 
  mutate_(.vars = vars(ppa2010, ppa2009, ppa2008), 
          .funs = factor((levels = c(0, 1, 2, 3, 4, 5, 6, 7), 
         labels = c("Parity 0", "Parity 1", "Parity 2", "Parity 3", "Parity 4", "Parity 5", "Parity 6", "Parity 7+")))

Я хотел бы создать новые переменные, используя циклы или некоторые функции, которые ускоряют процесс.Кроме того, разверните фрейм данных, добавьте эти переменные в качестве факторов, потому что в будущем мне потребуется создать гистограммы для анализа, и этот процесс будет повторяться или пять раз.

1 Ответ

1 голос
/ 22 марта 2019

Если вы хотите избежать изменения ваших данных, что не всегда просто в этом формате, вы можете использовать функции _at в dplyr. Главное, что нужно знать о mutate_at, что, на мой взгляд, не слишком очевидно, - это то, что вы можете использовать его для создания новых столбцов с согласованным стилем именования. Итак, мы можем сделать:

  1. Используйте mutate_at для усечения столбцов pa, если у женщин было более 7 детей. Это в основном означает: сделать эту функцию, которая заменяет значения больше 7 на 7 в каждом столбце, который начинается с «pa». Синтаксис ~ представляет собой компактный способ описания временной функции в purrr и dplyr.

  2. Используйте mutate_at снова, но на этот раз с функцией в качестве именованного элемента списка и с функцией, которая создает функцию с правильными уровнями и метками. Имя будет добавлено к исходным именам столбцов с разделителем подчеркивания. Обратите внимание, что мы можем использовать str_c, чтобы не вводить каждый уровень вручную.

  3. Мы хотим, чтобы столбцы читались ppa вместо этого суффикса, поэтому мы можем использовать rename_at, чтобы переименовать их все. Сначала мы удаляем суффикс, а затем добавляем p в начало.

P.S. В конечном счете, вам может оказаться легче «привести в порядок» ваши данные, чтобы каждая строка представляла собой год женщины, а не женщину.

library(tidyverse)

pa2010 <- c(0, 0, 2, 5, 3, 6, 8, 2, 1, 1)
pa2009 <- c(0, 0, 2, 4, 3, 6, 8 ,2, 0, 0)
pa2008 <- c(0, 0, 1, 4, 3, 5, 8, 1, 0, 0)

Parity <- data.frame(pa2010, pa2009, pa2008)
Parity %>%
  mutate_at(
    .vars = vars(starts_with("pa")),
    .funs = ~ if_else(. >= 7, 7, .)
  ) %>%
  mutate_at(
    .vars = vars(starts_with("pa")),
    .funs = list(
      parity = ~ . %>%
        factor(levels = 0:7, labels = str_c("Parity ", 0:7)) %>%
        fct_recode("Parity 7+" = "Parity 7")
    )
  ) %>%
  rename_at(
    .vars = vars(ends_with("_parity")),
    .funs = . %>%
      str_remove("_parity") %>%
      str_c("p", .)
  )
#>    pa2010 pa2009 pa2008   ppa2010   ppa2009   ppa2008
#> 1       0      0      0  Parity 0  Parity 0  Parity 0
#> 2       0      0      0  Parity 0  Parity 0  Parity 0
#> 3       2      2      1  Parity 2  Parity 2  Parity 1
#> 4       5      4      4  Parity 5  Parity 4  Parity 4
#> 5       3      3      3  Parity 3  Parity 3  Parity 3
#> 6       6      6      5  Parity 6  Parity 6  Parity 5
#> 7       7      7      7 Parity 7+ Parity 7+ Parity 7+
#> 8       2      2      1  Parity 2  Parity 2  Parity 1
#> 9       1      0      0  Parity 1  Parity 0  Parity 0
#> 10      1      0      0  Parity 1  Parity 0  Parity 0

Создано в 2019-03-22 пакетом представ. (v0.2.1)

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