2017-10-17 5 views
2

私は以下のR data.tableを持っています(ただし、これもdata.frameでスケーリングする必要があります)。目標は、このデータテーブルを整形して、散布図としてggplot2にプロットすることです。私はそのためのポイントを着色する1「要因」の列を持っているこの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

1列に基づいて溶融する方法1「擦り傷」AとB型の列2-3からそれぞれの列4-5 ...

答えて

3

meltを使用してのご提案のアプローチの後、data.table以内に滞在、あなたは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(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 

この回答のロジックが提案dplyrgather %>% separate %>% spreadのアプローチが、data.tableを使用するのと同じですを広げるdcastを使用することができます。

+0

ありがとうございました。軽微な修正:上記の答えは 'ID変数値'を出力します。私は – ShanZhengYang

+1

'ID変数であることを出力する必要があります。 – SymbolixAU

+0

@ShanZhengYangを更新します編集を参照してください - 質問はそうそうX y' – 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の組み合わせを削除します。
関連する問題