Преобразуйте широкий формат (87 элементов) в длинный формат 4 переменные - PullRequest
0 голосов
/ 11 октября 2019

У меня есть кадр данных в широком формате (четыре переменные с оценкой от 1 до 7), которые повторяются для 87 элементов. Мой фрейм данных выглядит так

Тема |Переменная 1 для элемента 1 |Переменная 2 для элемента 1 |Переменная 3 для элемента 1 |Переменная 4 для элемента 1

, пока мы не получим переменную 1 для элемента 87 |Переменная 2 для элемента 87 | Переменная 3 для элемента 87 | Переменная 4 для элемента 87

Цель:

Тема Переменная 1 Переменная 2 Переменная 3 Переменная 3 Переменная 4

1

1

1

1 (для 87 наименований)

Оцените любой пример кода ..

1 Ответ

0 голосов
/ 11 октября 2019

Это решение использует pivot_longer и pivot_wider из пакета tidyr. Если вы ранее использовали tidyr или tidyverse, я бы порекомендовал проверить, что у вас установлена ​​версия tidyr 1.0.0, или просто переустановить tidyr ...

Итак, во-первых, я рекомендую взглянуть на эту статью, когдаВы получаете шанс, это дает большую помощь: https://tidyr.tidyverse.org/articles/pivot.html

Рабочий процесс довольно прост. Сначала нам нужно сделать ваши очень широкие данные длинными. Во-вторых, нам нужно разделить столбцы переменных и элементов. Затем, наконец, мы можем снова развернуть ширину, используя только столбец переменных

# Create dummy data
x <- tibble(
        var = c('Variable 1 for item 1', 'Variable 2 for item 1', 
                'Variable 3 for item 1', 'Variable 4 for item 1', 
                'Variable 1 for item 2', 'Variable 2 for item 2', 
                'Variable 3 for item 2', 'Variable 4 for item 2'),
        results = c(runif(8))) %>% 
        mutate(subject = row_number())

# Pivot the table wider to replicate the description. 
# I could have written it this way, but I thought it might 
# take longer ... 
x_wide <- x %>% 
        pivot_wider(names_from = var, 
                    values_from = results)


# This is the actual part you care about
x_long <- x_wide %>%
# So first we need to make the table longer, so that 
# we can manipulate the column names into something workable
        pivot_longer(cols = starts_with('Variable'), 
                     names_to = 'var', 
                     values_to = 'val') %>%
# Next we need to separate the column name into variable and item
        separate(var, into = c('variable', 'item'), 
                 sep = 'for') %>% 
# This is just cleaning up the item and variable columns
        mutate(item = str_remove(item, 'item'), 
               item = str_trim(item, side = 'both'), 
               variable = str_trim(variable, side = 'both')
               ) %>% 
# lastly we pivot wide again but this time only on the variable
        pivot_wider(names_from = variable, 
                    values_from = val)

Надеюсь, это поможет! Мне пришлось сделать много предположений о том, как выглядят данные. Буду рад продолжить, если я ошибся.

...