Изменение формы кадра данных в R на основе количества уникальных значений

Я работаю с данными заявления о приеме на работу, где каждая предыдущая работа - это строка в файле Excel. Я хочу преобразовать набор данных таким образом, чтобы для каждого прошлого работодателя были столбцы 1,2,3,4 и т. Д.

Я думаю, что проблему лучше всего объяснить на примере. Как мне добраться от начального фрейма данных до нужного фрейма данных?

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

id <- c(1000,1000,1002,1007,1007,1007,1007,1009) 
employers <-c("Ikea","Subway","DISH","DISH","Ikea","Starbucks","Google","Google")
start_date <- c("2/1/2013","5/1/2000","4/1/2012","3/1/2014","8/15/2011","4/15/2008","2/1/2004","3/15/2010")
start <- data.frame(cbind(id,employers,start_date))
colnames(start) <- c("id","employers","start_date")

start

unique_id <- c(1000,1002,1007,1009)
emp1 <- c("Ikea","DISH","DISH","Google")
emp2 <- c("Subway",NA,"Ikea",NA)
emp3 <- c(NA,NA,"Starbucks",NA)
emp4 <- c(NA, NA,"Google",NA)
emp1_start <- c("2/1/2013","4/1/2012","3/1/2014","3/15/2010")
emp2_start <- c("5/1/2000",NA,"8/15/2011",NA)
emp3_start <- c(NA,NA,"4/15/2008",NA)
emp4_start <- c(NA,NA,"2/1/2004",NA)
desired <- data.frame(cbind(unique_id,emp1,emp2,emp3,emp4,emp1_start,emp2_start,emp3_start,emp4_start))

desired

1 ответ

Использование ваших данных (намеренно с factorс, достаточно легко исправить с stringsAsFactors = FALSE):

start <- data.frame(
          id=c(     "1000",      "1000",      "1002",      "1007",
                    "1007",      "1007",      "1007",      "1009" ),
   employers=c(     "Ikea",    "Subway",      "DISH",      "DISH",
                    "Ikea", "Starbucks",    "Google",    "Google" ),
  start_date=c( "2/1/2013",  "5/1/2000",  "4/1/2012",  "3/1/2014",
               "8/15/2011", "4/15/2008",  "2/1/2004", "3/15/2010" )
)

Будет ли это работать для вас?

library(dplyr)
library(tidyr)

a <- start %>%
  select(-start_date) %>%
  group_by(id) %>%
  mutate(emp = sprintf("emp%s", seq_len(n()))) %>%
  ungroup() %>%
  spread(emp, employers)

b <- start %>%
  select(-employers) %>%
  group_by(id) %>%
  mutate(emp = sprintf("emp%s_start", seq_len(n()))) %>%
  ungroup() %>%
  spread(emp, start_date)

left_join(a, b, by = "id")
# # A tibble: 4 x 9
#       id   emp1   emp2      emp3   emp4 emp1_start emp2_start emp3_start emp4_start
#   <fctr> <fctr> <fctr>    <fctr> <fctr>     <fctr>     <fctr>     <fctr>     <fctr>
# 1   1000   Ikea Subway        NA     NA   2/1/2013   5/1/2000         NA         NA
# 2   1002   DISH     NA        NA     NA   4/1/2012         NA         NA         NA
# 3   1007   DISH   Ikea Starbucks Google   3/1/2014  8/15/2011  4/15/2008   2/1/2004
# 4   1009 Google     NA        NA     NA  3/15/2010         NA         NA         NA
Другие вопросы по тегам