2012-09-20 59 views
5

鑄造(dcast)分配新列標頭時可以更改默認分隔符嗎?在鑄造中更改默認分隔符

我從長轉換文件到寬,我得到以下標題:

value_1, value_2, value_3,... 

在重塑您可以指定「SEP」參數(SEP =「」)和列標題輸出像我希望他們能夠:

value1, value2, value3,... 

然而,重塑需要幾分鐘對我的數據幀以超過20萬行,而dcast需要幾秒鐘。 dcast也會按照我想要的順序輸出這些列,其中reshape不會。有沒有簡單的方法可以通過dcast更改輸出,還是需要手動更改列標題?

例如:

example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1)) 
dcast(example,id~variable+index) 

的例子給出了列標題:

conc_1, conc_2, resp_1, resp_2 

我想列標題改爲:

conc1, conc2, resp1, resp2 

我曾嘗試:

dcast(example,id~variable+index,sep="") 

dcast似乎完全忽略了sep,因爲給出一個符號也不會改變輸出。

+0

請包括一個可重複的例子。 –

+0

@mplourde我添加了一個例子。 – dayne

回答

3

你不能,因爲該選項沒有納入dcast。但在運行dcast之後執行此操作相當簡單。

casted_data <- dcast(example,id~variable+index) 


library(stringr) 
names(casted_data) <- str_replace(names(casted_data), "_", ".") 

> casted_data 
    id conc.1 conc.2 resp.1 resp.2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 

# If you need to do this often, just wrap dcast in a function and 
# change the names before returning the result. 

f <- function(df, ..., sep = ".") { 
    res <- dcast(df, ...) 
    names(res) <- str_replace(names(res), "_", sep) 
    res 
} 

> f(example, id~variable+index, sep = "") 
    id conc1 conc2 resp1 resp2 
1 1 5.554279 5.225686 5.684371 5.093170 
2 2 4.826810 5.484334 5.270886 4.064688 
3 3 5.650187 3.587773 3.881672 3.983080 
4 4 4.327841 4.851891 5.628488 4.305907 
+0

我知道替換名字很容易,但如果可能的話,我正在尋找一種方法。我還有其他列標題,下劃線,所以它會需要幾行代碼 - 儘管它仍然很容易。 – dayne

+0

這是_is_的方式。你可以重寫'dcast'和'reshape2'的內部函數,但這樣做會更加有效,而且完全沒有必要。包裝在一個功能將使它在相同數量的代碼行(只有1) – Maiasaura

+0

感謝你們倆。 – dayne

1

一個選項:

example <- data.frame(example,by=paste(example$variable,example$index,sep="")) 
dcast(example,id~by) 
2

dcast在data.table包(開發版本1.9.5)目前擁有 '月' 的說法。

+0

1.9.5已經過時了,上面的@arekolek提供了一個更完整的答案, – MichaelChirico

2

基於information provided by dbetebennerusing data.table for improved dcast functionality另一個例子,你的例子就變成:

> library(data.table) 
> dcast(setDT(example), id ~ variable + index, sep="") 
    id conc1 conc2 resp1 resp2 
1: 1 5.113707 5.475527 5.938592 4.149636 
2: 2 4.261278 6.138082 5.277773 5.907054 
3: 3 4.350663 4.292398 6.277582 4.167552 
4: 4 5.993198 6.601669 5.232375 5.037936 

setDT()參照轉換表和data.framesdata.tables

data.table v1.9.6測試。