Изменение формы данных на длинные: новые переменные на основе имен столбцов - PullRequest
0 голосов
/ 19 июня 2020

Я хочу преобразовать набор данных из широкого формата в длинный.

Набор данных содержит 300 переменных типа something, и каждая переменная названа по принципу: ModelID_Emotion_ModelGender. Примеры данных ниже:

structure(list(X71_Anger_Male = structure(c(3L, 1L, 2L), .Label = c("Anger", 
"Disgust", "Fear"), class = "factor"), X71_Disgus_Male = structure(c(2L, 
1L, 1L), .Label = c("Disgust", "Fear"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

Я хочу транспонировать данные таким образом, чтобы информация из имен столбцов бралась и помещалась в новые переменные. Например, должна быть новая переменная ModelGender, новая переменная modelID и новая переменная эмоции. Таким образом, набор данных должен выглядеть следующим образом:

structure(list(Gender = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Male", class = "factor"), 
    ModelNumber = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "X71", class = "factor"), 
    Emotion = structure(c(2L, 2L, 2L, 1L, 1L, 1L), .Label = c("Anger", 
    "Disgust"), class = "factor"), Response = structure(c(3L, 
    2L, 2L, 3L, 1L, 2L), .Label = c("Anger", "Disgust", "Fear"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

Когда я использую изменение формы, сборку / распространение или плавление / заливку, это не дает желаемых результатов. Кто-нибудь знает, как это сделать?

Спасибо за ваше время!

Ответы [ 2 ]

1 голос
/ 19 июня 2020

В pivot_longer вы можете указать names_sep как "_" и разделить имена столбцов на 3 столбца.

tidyr::pivot_longer(df, cols = everything(),
                        names_to = c('ModelNumber', 'Emotion', 'Gender'), 
                        values_to = 'Response',
                        names_sep = '_')

# A tibble: 6 x 4
#  ModelNumber Emotion Gender Response
#  <chr>       <chr>   <chr>  <fct>   
#1 X71         Anger   Male   Fear    
#2 X71         Disgus  Male   Fear    
#3 X71         Anger   Male   Anger   
#4 X71         Disgus  Male   Disgust 
#5 X71         Anger   Male   Disgust 
#6 X71         Disgus  Male   Disgust 
1 голос
/ 19 июня 2020

Вы можете просто преобразовать в длинный и разделить нужный столбец. Путь через методы tidyverse может быть,

library(dplyr)
library(tidyr)

df %>% 
 pivot_longer(everything()) %>% 
 separate(name, into = c('ModelNumber', 'Emotion', 'Gender'), sep = '_')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...