2016-08-17 9 views
0

私は、以前の各ジョブがExcelファイル内の行であるジョブアプリケーションデータを扱っています。過去の各雇用者1,2,3,4などのための列があるようにデータセットを変換したい。ユニークな値の数に基づいてRでデータフレームを再形成

問題は例で最もよく説明されていると思う。開始データフレームから目的のデータフレームに到達するにはどうすればよいですか?

私はいくつかの融解とキャスティングを試みましたが、一意の会社名ごとに作成された列を必要とせず、独自の会社名の数に基づいているため、

stringsAsFactors = FALSEで固定するのに十分な意図的 factor sの、簡単に)あなたのデータを使用して
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 < - (start、ave(.character(id)、id、FUN = seq_along));もう一つの答えからreshape(start、direction = "wide"、idvar = "id"、sep = "") ' – thelatemail

+0

あなたは列の名前を変更するのを忘れていました:-)(ちょうど冗談です...あなたのコード・ゴルフは私の手をひどく叩きます)。 – r2evans

+0

私の例を使って、重複を発見し、回答を投稿するための@thelatemailに感謝します。私の実際のデータには、reshapeが期待しているようにtimevarを作成するのは、もっと大きくて面倒な作業でした。 – andrea

答えて

0

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

ありがとう@ r2evens。私は未来のためにこれに掛かるつもりです。私の単純な例ではうまくいきましたが、過去の学校や関連する日付、GPAなどに複数の行があり、select()部分が単純ではなかったため、実際のデータは少し面倒でした。 – andrea

関連する問題