Используя 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))