как распространять несбалансированные данные от длинных до широких в г - PullRequest
0 голосов
/ 14 мая 2019

У меня есть фрейм данных с 5 переменными по 1000 строк.Первые несколько строк и первые пять столбцов выглядят так:

id  trade   category    gender  experience
1   carpenter       c   m   no
1   mason           b   m   yes
2   electrician     a   f   no
2   plumber         a   f   no
2   carpenter       c   f   yes
2   mason           d   f   no
3   plumber         a   m   no
4   mason           b   m   yes
4   plumber             m   no
4   electrician     b   m   no

Я попытался расширить и преобразовать фигуру из длинного в широкое

Я ожидаю увидеть следующее.

id  trade1     catgory1 trade2  category 2  trade3      category3   trade4  category4   gender
1   carpenter   c       mason   b            na             na        na    na  m
2   electrician a       plumber a            carpenter      c         mason d   f
3   plumber     a       na      na           na             na        na    na  m
4   mason       b       plumber na           electrician    b         na    na  m

1 Ответ

0 голосов
/ 14 мая 2019

Используя tidyverse, мы можем удалить столбец experience, поскольку он не нужен в конечном выводе, gather кадр данных в длинном формате, group_by id и key и создать новый идентификатор группыkey1 и spread в широком формате.

library(tidyverse)

df1 <- df %>%
  select(-experience) %>%
  gather(key, value ,-id, -gender) %>%
  group_by(id, key) %>%
  mutate(key1 = paste(key, row_number(), sep = "_"))  %>%
  ungroup() %>%
  select(-key) %>%
  spread(key1, value)

df1

# A tibble: 4 x 10
#     id gender category_1 category_2 category_3 category_4 trade_1     trade_2 trade_3     trade_4
#  <int> <fct>  <chr>      <chr>      <chr>      <chr>      <chr>       <chr>   <chr>       <chr>  
#1     1 m      c          b          NA         NA         carpenter   mason   NA          NA     
#2     2 f      a          a          c          d          electrician plumber carpenter   mason  
#3     3 m      a          NA         NA         NA         plumber     NA      NA          NA     
#4     4 m      b          b          b          NA         mason       plumber electrician NA   

Чтобы упорядочить столбцы в требуемом формате, мы можем сделать

df1 %>%
  select(id, gender, ends_with("1"), ends_with("2"), ends_with("3"), ends_with("4"))

Или, в более общем случае,

cbind(df1[1:2], df1[-c(1:2)][order(readr::parse_number(names(df1[-(1:2)])))])

data

df <- structure(list(id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 4L, 4L, 4L), 
trade = structure(c(1L, 3L, 2L, 4L, 1L, 3L, 4L, 3L, 4L, 2L
), .Label = c("carpenter", "electrician", "mason", "plumber"
), class = "factor"), category = structure(c(3L, 2L, 1L, 
1L, 3L, 4L, 1L, 2L, 2L, 2L), .Label = c("a", "b", "c", "d"
), class = "factor"), gender = structure(c(2L, 2L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L), .Label = c("f", "m"), class = "factor"), 
experience = structure(c(1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
1L, 1L), .Label = c("no", "yes"), class = "factor")), class = 
"data.frame", row.names = c(NA, -10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...