2017-02-06 75 views
2

我想繪製兩種類型的值(dupl和orig)。是否可以輕鬆重塑以下數據幀在R中,使用熔體重塑「混合」數據幀並鑄造

record=c("r1","r1","r2","r3","r3") 
v1=rep(0,5) 
v2=c(0,0,1,0,0) 
v3=c(1,1,0,1,1) 
type=c("orig","dupl","orig","orig","dupl") 

df<-data.frame(record, v1, v2, v3, type) 
df 
    record v1 v2 v3 type 
1  r1 0 0 1 orig 
2  r1 0 0 1 dupl 
3  r2 0 1 0 orig 
4  r3 0 0 1 orig 
5  r3 0 0 1 dupl 

看起來像這樣?

record v1.orig v2.orig v3.orig v1.dupl v2.dupl v3.dupl 
r1   0  0  1  0  0  1 
r2   0  1  0    
r3   0  0  0  0  0  0 

這個問題的關鍵是我可以做一個vX.orig vs vX.dupl的陰謀。還是有更好的方法來做到這一點? 我正在看dcast(),但似乎無法得到我想要的,可能是因爲我的數據只是部分熔化(沿着類型?)。

編輯:這裏是我已經試過:

df1<-melt(df,id="record") 
dcast(df1,record~value, margins=TRUE) 

回答

3

,你可以做這樣的:

library(reshape2) 
melted <- melt(df, id.vars= c("record", "type")) 
dcast(melted, record ~ variable + type) 

    record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig 
1  r1  0  0  0  0  1  1 
2  r2  NA  0  NA  1  NA  0 
3  r3  0  0  0  0  1  1 

或我原來的答覆:

library(tidyverse) 
df %>% gather(vx, num, -record, -type) %>% 
    unite(type, vx, type) %>% 
    spread(type, num) 
+0

可以這樣概括它不以「V」開始列使用recast另一種選擇? ...在我的真實場景中,我希望所有列(40)都重複爲「_dupl」。 – val

+0

確定您可以將該部分調整爲其他'dplyr :: select()'術語,使用'reshape2'檢查替代編輯 – Nate

2

在基礎R ,使用雙重重塑。這也將適當地重塑任何v1v2stem1stem2等變量組:

ids <- c("record","type") 
tmp <- reshape(df, idvar=ids, direction="long", varying=setdiff(names(df), ids), sep="") 
reshape(transform(tmp, time=interaction(time,type), type=NULL), idvar="record", direction="wide") 

#   record v.1.orig v.1.dupl v.2.orig v.2.dupl v.3.orig v.3.dupl 
#r1.orig.1  r1  0  0  0  0  1  1 
#r2.orig.1  r2  0  NA  1  NA  0  NA 
#r3.orig.1  r3  0  0  0  0  1  1 
1

這裏是reshape2

library(reshape2) 
recast(df, record~variable + type) 
# record v1_dupl v1_orig v2_dupl v2_orig v3_dupl v3_orig 
#1  r1  0  0  0  0  1  1 
#2  r2  NA  0  NA  1  NA  0 
#3  r3  0  0  0  0  1  1