2014-04-04 41 views
0

我以爲我確實將寬數據轉換爲long,並且我一直在使用它一段時間,但是最近我發現出了點問題。顯然,代碼是錯誤的,我似乎無法修復它。將複雜的寬數據轉換爲長R

寬泛的數據是複雜的,因爲它包含了有關何人開始他/她的第一份工作,第二份工作等的信息。我想把它變成面板數據。

因此原始數據df如下所示:

id name gender job1 sjob1 ejob1 job2 sjob2 ejob2 job3 sjob3 ejob3 
1 Jane F  100 1990 1992 103 1993 1995 104 1994 1997 
2 Tom M  200 1978 1980 400 1981 1985 NA NA NA 

作業號碼是工作代碼,表明某些工作,即管理,銷售等

以上是充滿了很短的版本我有數據。需要的輸出是:

id name gender year job 
1 Jane F  1990 100 
1 Jane F  1991 100 
1 Jane F  1992 100 
1 Jane F  1993 103 
1 Jane F  1994 104 
1 Jane F  1995 104 
1 Jane F  1996 104 
1 Jane F  1997 104 
2 Tom M  1978 200 
2 Tom M  1979 200 
2 Tom M  1980 200 
2 Tom M  1981 400 
2 Tom M  1982 400 
2 Tom M  1983 400 
2 Tom M  1984 400 
2 Tom M  1985 400 

我對廣泛版本總共有大約1600個觀察值。 (1600人)。我試過以下,但沒有奏效:

df_long <-reshape(df, 
      varying=c("job1", "job2", "job3"), 
      v.names="job", 
      timevar="year", 
      times=c("sjob1", "sjob2", "sjob3"), 
      direction = "long") 

這實際上成功地在sjob1,sjob2,sjob3(每個任務的起始年)的順序保留職位代碼,但沒有保存歲以下sjob1只是記錄sjob1代替:

id name gender year job 
1 Jane F  sjob1 100 
1 Jane F  sjob2 103 
1 Jane F  sjob3 104 
2 Tom M  sjob1 200 
2 Tom M  sjob2 400 
2 Tom M  sjob3 NA 

以上是我的原始數據的例子,所以我想發表我的原始數據,以及:https://www.dropbox.com/s/ygbkd91ataqkwz5/origin_wide.RData

+1

難道這是HTTP的副本://計算器。com/questions/9004399/reshape-panel-data-wide-format-to-long-format? – krlmlr

+1

你的代碼的結果與你期望的結果有什麼不同? – krlmlr

+0

@krlmlr我編輯了這個問題!它設法按順序放置「工作」,但沒有吐出代碼中創建的「年」變量的年份。 – song0089

回答

0

你可以做到這一點與plyr包:

# reading the data 
df <- read.table(text = "id name gender job1 sjob1 ejob1 job2 sjob2 ejob2 job3 sjob3 ejob3 
1 Jane F  100 1990 1992 103 1993 1995 104 1994 1997 
2 Tom M  200 1978 1980 400 1981 1985 NA NA NA", header = TRUE, strip.white = TRUE) 

# needed package 
require(plyr) 

# transforming the data 
df2 <- rbind(
    ddply(df, .(id, name, gender), mutate, year = sjob1, job = job1), 
    ddply(df, .(id, name, gender), mutate, year = ejob1, job = job1), 
    ddply(df, .(id, name, gender), mutate, year = sjob2, job = job2), 
    ddply(df, .(id, name, gender), mutate, year = ejob2, job = job2), 
    ddply(df, .(id, name, gender), mutate, year = sjob3, job = job3), 
    ddply(df, .(id, name, gender), mutate, year = ejob3, job = job3) 
) 

# getting rid off NA's & ordering the dataframe by id 
df2 <- na.omit(df2[order(df2$id),c(1:3,13,14)]) 
+0

這很像魔術,非常感謝! – song0089

0

下面是使用reshape2草圖和plyr

第1步:重塑一個「長」格式,這是你要找的內容有所不同:

library(reshape2) 
df.m <- melt(df, id.vars=c("id", "name", "gender")) 

這會給你開始和結束時間,以及分類,對就業機會。

第2步:隔離作業ID:

df.m$job.id <- as.integer(gsub("^(.*job)([0-9]+)$", "\\2", df.m$variable)) 
df.m$variable <- gsub("^(.*)([0-9]+)$", "\\1", df.m$variable) 

第3步:你可以計算工作分類的表中的每個人的ID和作業ID(連同姓名和性別):

library(plyr) 
df.jc <- rename(subset(df.m, variable=="job", select=c("id", "name", "gender", "value")), variable=job) 

步驟4:要獲得完整的結果,您需要dcast數據以獲得「寬」格式,其中包含兩列sjobejob以及每個作業ID的每個人員ID一個觀察值。然後,您可以adply生成一個年份序列,並將其合併回df.jc

我還沒有測試代碼,也不能給你最後一步的東西,因爲我無法輕鬆讀取示例數據。如果您的數據爲dput,那會非常有幫助。請提出一個單獨的,更詳細的問題以解決進一步的問題,並提供一些代碼和數據。

+0

謝謝,我應該發佈整個原始寬版本的數據嗎? – song0089

+0

對於第三步,我得到了重命名錯誤錯誤(子集(df.m,變量==「作業」,選擇= c(「id」,「名稱」,: 未使用的參數(變量=作業) – song0089

+0

@ Rusuer9000 :錯誤的語法,我的錯誤,你可以嘗試'rename(...,list(variable =「job」))'? – krlmlr