Как составить несколько столбцов из домашнего реестра, используя тидир - PullRequest
1 голос
/ 12 марта 2020

У меня есть данные опроса, где одного респондента на домохозяйство спрашивали об возрасте и уровне образования каждого члена домохозяйства. Данные являются широкими, в том смысле, что есть индексированные столбцы для возраста и образования каждого члена домохозяйства.

Вот простой пример:

df <- 
  data.frame(
    HHID = 1:2,
    age_1 = c(4, 19),
    yrsedu_1 = c(8,12),    
    age_2 = c(7, 6),
    yrsedu_2 = c(14, 6)
  )

Таким образом, age_1 - это возраст одного члена домохозяйства 1 и edu_2 - это уровень его образования.

По сути, я хочу составить пары столбцов (2 столбца на члена домохозяйства), чтобы получить длинный набор данных, подобный этому:

  data.frame(
    HHID = c(1,1,2,2),
    hh_child_number = c(1,2,1,2),
    age = c(4,7,19,6),    
    yrsedu = c(8,14,12,6))  

Как я могу сделать это с gather в tidyr? Пары столбцов вызывают проблемы.

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

После выхода на пенсию gather вы можете использовать новый pivot_longer:

tidyr::pivot_longer(df, cols = -HHID, 
         names_to = c(".value", "hh_child_number"), 
         names_sep = "_") %>% type.convert(as.is = TRUE)


# A tibble: 4 x 4
#   HHID hh_child_number   age yrsedu
#  <int>           <int> <int>  <int>
#1     1               1     4      8
#2     1               2     7     14
#3     2               1    19     12
#4     2               2     6      6
0 голосов
/ 12 марта 2020

Это не решение tidyverse, но просто упомянуть, что одной альтернативой будет использование функции melt из data.table:

library(data.table)
age <- grep("age",colnames(df))
yr <- grep("yrsedu", colnames(df))

setDT(df)
melt(df, measure = list(age,yr), value.name = c("Age", "Yrsedu"), variable.name = "hh_child_number")

   HHID hh_child_number Age Yrsedu
1:    1               1   4      8
2:    2               1  19     12
3:    1               2   7     14
4:    2               2   6      6
...