2016-01-25 22 views
1

與我一起工作的數據中的常見任務是將客戶端數據從長變爲寬。我有一個過程,用下面概述的Reshape做到這一點,它基本上創建了一個附加了數字索引的新的(但未修改的)列。在我的情況下,我不想對數據進行任何修改。我的問題,因爲我經常使用reshape2進行其他操作,這是如何通過dcast實現的?例如,似乎並不需要使用id來融化示例數據,但我不確定如何將它擴大。任何人都可以在reshape2中提供代碼,以便在下面的示例中生成與「寬」相當的框架?使用Reshape2將Reshape DF從長變寬爲R,但不使用聚合功能

謝謝。

date_up <- as.numeric(as.Date("1990/01/01")) 
date_down <- as.numeric(as.Date("1960/01/01")) 
ids <- data.frame(id=rep(1:1000, 3),site=rep(c("NMA", "NMB","NMC"), 1000)) 
ids <- ids[order(ids$id), ] 
dates <- data.frame(datelast=runif(3000, date_down, date_up), 
      datestart=runif(3000, date_down, date_up), 
      dateend=runif(3000, date_down, date_up), 
      datemiddle=runif(3000, date_down, date_up)) 
dates[] <- lapply(dates[ , c("datestart", "dateend", "datemiddle")], 
      as.Date.numeric, origin = "1970-01-01") 
df <- cbind(ids, dates) 

# Make a within group index and reshape df 
df$gid <- with(df, ave(rep(1, nrow(df)), df[,"id"], FUN = seq_along)) 
wide <- reshape(df, idvar = "id", timevar = "gid", direction = "wide") 
+0

目前一個需要兩次運行這個(與初始誤差,大部分R-newbs會發現令人費解具有做「關閉「,因爲對象'df'是R中的F密度函數。第二次有'df'-數據對象,所以沒有錯誤發生(我只做了一個30行矩陣。 ) –

+0

你是正確的,謝謝你指出這一點。我更新了代碼來修復錯誤。 –

回答

2

我們可以使用dcastdata.table,這可能需要多個value.var列。將'data.frame'轉換爲'data.table'(setDT(df)),使用dcast並指定value.var

library(data.table) 
dcast(setDT(df), id~gid, value.var=names(df)[2:6]) 

注:data.table方法會更快相比reshape2

+0

感謝。越來越多的我想知道如果我應該把我的批處理過程轉移到data.table,因爲它似乎有很多這個軟件包的解決方案和它的各種幫助。現在看來dcast只會對一個值var進行操作,這意味着我需要首先將它融合,看起來似乎。再次感謝這種方法,我會給它一個機會。 –