Изменение формы кадра данных в 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