2016-08-17 4 views
0

Ich arbeite mit Bewerbungsdaten wo jeder vorherige Job eine Zeile in einer Excel-Datei war. Ich möchte den Datensatz so transformieren, dass es Spalten für jeden früheren Arbeitgeber gibt. 1,2,3,4 usw.Datenrahmen-Umformung in R basierend auf der Anzahl der eindeutigen Werte

Ich denke, dass das Problem am besten mit einem Beispiel erklärt wird. Wie komme ich vom Startdatenrahmen zum gewünschten Datenrahmen?

Ich habe versucht, etwas schmelzen und Gießen, aber ich bin stecken geblieben, weil ich nicht eine Spalte für jeden eindeutigen Firmennamen, sondern basierend auf der Anzahl der eindeutigen Firmennamen erstellen möchte.

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 
+0

'start $ time <- mit (start, ave (as.zeichen (id), id, FUN = seq_along)); reshape (start, direction = "breit", idvar = "id", sep = "") 'von der anderen Antwort. – thelatemail

+0

Sie haben vergessen, die Spalten umzubenennen :-) (nur Spaß ... Ihr Codegolf schlägt meins handlich). – r2evans

+0

Danke @thelatemail, um das Duplikat zu finden und auch eine Antwort mit meinem Beispiel zu posten. Das Erstellen der Zeitvariable, wie sie von reshape erwartet wird, funktionierte perfekt auf meinen tatsächlichen Daten mit ist viel größer und unordentlicher. – andrea

Antwort

0

Ihre Daten verwenden (absichtlich mit factor s, leicht genug, um zu beheben, mit 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") 
) 

Wird diese Arbeit für Sie?

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 
+0

Danke @ r2evens. Ich werde daran für die Zukunft hängen. Es funktionierte großartig an meinem einfachen Beispiel, war aber ein bisschen umständlich auf den tatsächlichen Daten, die auch mehrere Zeilen für vergangene Schulen und damit verbundenen Daten, GPAs usw., so dass der select() Teil war nicht einfach. – andrea

Verwandte Themen