2017-10-17 85 views
2

我有以下R data.table(儘管這也應該用data.frame進行縮放)。目標是將這個data.table重塑爲ggplot2中的散點圖。因此,我需要重塑這個data.table有一個「因素」一欄顏色分:使用因子列熔化R data.table

> library(data.table) 
> dt 
    ID     x_A    y_A  x_B  y_B                                                 
    1: 05AC   0.81    3   0.92  2.05                                                 
    2: 01BA   0.41    5   0.63  1.8                                                 
    3: Z1AC   0.41    5   0.58  1.8                                                 
    4: B2BA   0.21    6.5   1.00  1.8 
    .... 

我相信正確的輸出需要的形式爲:

ID  type x  y 
05AC A  0.81 3  
05AC B  0.92 2.05 
01BA A  0.41 5 
01BA B  0.63 1.8 
Z1AC A  0.41 5 
Z1AC B  0.58 1.8 
B2BA A  0.21 6.5 
B2BA B  1.00 1.8 

是否有一個用這種方式「展開」data.tables的標準方法?我很高興在這種情況下如何使用dplyr,但我懷疑應該有一個data.table方法。

melt()會工作,如果我能弄清楚如何創建列type,例如,

melt(dt, id.vars=c("ID")) 

只會熔化基礎上,一列ID

我特別困惑是如何從2-3列一個「擦傷」的A和B型分別列4-5 ...

回答

3

住,你建議使用melt的方法後,你可以tstrsplit的變量基礎上,「_」性格分裂。

## use tstrsplit to split a column on a regular expression 
dt[, c("xy", "type") := tstrsplit(variable, "_")] 
dt 
#  ID variable value xy type 
# 1: 05AC  x_A 0.81 x A 
# 2: 01BA  x_A 0.41 x A 
# 3: Z1AC  x_A 0.41 x A 
# 4: B2BA  x_A 0.21 x A 
# 5: 05AC  y_A 3.00 y A 
# 6: 01BA  y_A 5.00 y A 
# 7: Z1AC  y_A 5.00 y A 
# 8: B2BA  y_A 6.50 y A 
# 9: 05AC  x_B 0.92 x B 
# 10: 01BA  x_B 0.63 x B 
# 11: Z1AC  x_B 0.58 x B 
# 12: B2BA  x_B 1.00 x B 
# 13: 05AC  y_B 2.05 y B 
# 14: 01BA  y_B 1.80 y B 
# 15: Z1AC  y_B 1.80 y B 
# 16: B2BA  y_B 1.80 y B 

這給你所需的解決方案的長形式。然後,您可以使用dcast擴大它

dcast(dt, formula = ID + type ~ xy) 

#  ID type x y 
# 1: 01BA A 0.41 5.00 
# 2: 01BA B 0.63 1.80 
# 3: 05AC A 0.81 3.00 
# 4: 05AC B 0.92 2.05 
# 5: B2BA A 0.21 6.50 
# 6: B2BA B 1.00 1.80 
# 7: Z1AC A 0.41 5.00 
# 8: Z1AC B 0.58 1.80 

這個答案的邏輯是一樣的gather %>% separate %>% spread建議dplyr方法,但使用data.table

+0

感謝您的幫助。稍作糾正:上面的答案輸出「ID變量值」。這個問題需要輸出爲'ID變量x y' – ShanZhengYang

+1

噢是的 - 我會更新 – SymbolixAU

+0

@ShanZhengYang請參閱編輯。 – SymbolixAU

2

dplyrtidyr的組合可以產生您想要的結果。由於缺乏可重現的例子,這未經測試。

library(tidyr) 
library(dplyr) 

dt %>% 
    gather(variable, value, -ID) %>% 
    separate(variable, c("group", "type"), sep = "\\_") %>% 
    spread(group, value, na.rm = TRUE) 

此作用:

  1. 集除了ID列到鍵值的行,變量和值的所有列。
  2. 將變量列分爲組和類型,使用_作爲分隔符。
  3. 將組行的內容分散到列中並使用值列填充它們,刪除任何NA組合。內data.table