Преобразование длинного формата плоского файла в широкий в R - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть набор данных домохозяйства и члена в одном длинном плоском формате.Существует фиксированное количество членов, и каждый соответствует столбцу.Для простоты предположим, что на каждого домохозяйства приходится 2 члена, и предположим, что для членов (Q1) и пола (Q2) задано 2 вопроса.

Формат файла выглядит следующим образом:

HHID, MEM_ID_1, MEM_ID_2, AGE_1, AGE_2, GENDER_1, GENDER_2
1     1         2         50     45     M         F

И я хочу преобразовать его в следующий формат:

HHID MEM_ID AGE GENDER
1    1      50   M
1    2      45   F

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы можете использовать tidyr::gather(), tidyr::separate() и tidyr::spread() по порядку.Здесь household - имя вашего фрейма данных.

library(tidyverse)

1.gather

Сначала tidyr::gather().Тогда вы можете получить следующий результат:

household %>% 
  gather(-HHID, key = domestic, value = value)
#>   HHID domestic value
#> 1    1 MEM_ID_1     1
#> 2    1 MEM_ID_2     2
#> 3    1    AGE_1    50
#> 4    1    AGE_2    45
#> 5    1 GENDER_1     M
#> 6    1 GENDER_2     F

Теперь все, что вам нужно сделать, это

  1. отдельный столбец domestic в _[0-9]: в регулярном выражении, _(?=[0-9])
  2. Изменяя формат на широкоформатный, вы можете увидеть желаемый результат.

2.Вывод: весь код

household %>% 
  gather(-HHID, key = domestic, value = value) %>% # long data
  separate(domestic, into = c("domestic", "vals"), sep = "_(?=[0-9])") %>% # separate the digit
  spread(domestic, value) %>% # wide format
  select(HHID, MEM_ID, AGE, GENDER, -vals) # just arranging columns, and excluding needless column
#>   HHID MEM_ID AGE GENDER
#> 1    1      1  50      M
#> 2    1      2  45      F
0 голосов
/ 04 марта 2019

Допустим, наш фрейм данных test

dput(test)

structure(list(HHID = 1L, MEM_ID_1 = 1L, MEM_ID_2 = 2L, AGE_1 = 50L, 
AGE_2 = 45L, GENDER_1 = structure(1L, .Label = "Male", class = "factor"), 
GENDER_2 = structure(1L, .Label = "Female", class = "factor")), class = "data.frame", row.names = c(NA, 

-1L))

Вы можете попробовать функцию изменения формы этого фрейма данных, как показано ниже:

reshape(test, direction = "long",
        varying = list(c("MEM_ID_1","MEM_ID_2"), c("AGE_1","AGE_2"), c( "GENDER_1","GENDER_2")),
        v.names = c("MEM_ID","AGE","GENDER"),
        idvar = 'HHID')

Функция reshape () происходит от базы R. Вообще говоря, она может одновременно плавиться над несколькими наборами переменных, используя переменный параметр и устанавливая направление на long .

Например, в вашем случае у нас есть список из трех векторов имен переменных для варьируемого аргумента:

varying = list(c("MEM_ID_1","MEM_ID_2"), c("AGE_1","AGE_2"), c( "GENDER_1","GENDER_2"))

Вывод ниже:

    HHID time MEM_ID AGE GENDER
1.1   1    1     1   50   Male
1.2   1    2     2   45   Female
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...