3

2 つのテーブルがあり、一方から他方に情報を転送したいと考えています。

名前とサブネームがあります。名前とサブネームの組み合わせにはそれぞれ値が関連付けられており、最初のステップで個別に計算されます。

次のステップでは、各名前に 2 つの特別なサブネーム (sub1 と sub2) が割り当てられ、各名前とサブネームのペアに関連付けられた値を取得する必要があります。

つまり、名前ごとに、name+sub1 の値と name+sub2 の値を取得する必要があります。

最初のテーブルでは、各行に名前と、考えられるすべてのサブネームの値があります。ここで、サブネームはxyw、および と呼ばれzます。値は数値です。

Name    x    y    w    z
abc     4    8    3    1
def     2    5    1    7

2 番目の表では、各行の最初の列に名前があり、次の 2 列に 2 つの関連するサブ名があります。両方のテーブルの最初の列に名前の完全なセットがありますが、2 番目のテーブルのすべてのサブネームが最初のテーブルに存在するわけではありません。これらの行については、「NA」を返すだけで問題ありません。

Name    Sub1        Sub2
abc     x           y
def     w           z

これらのテーブルを結合したいので、次のようになります。

Name    Sub1        Sub2    Sub1.Value    Sub2.Value
abc     x           y       4             8
def     w           z       1             7

これらは、コピー/貼り付け可能なサンプル テーブルです (最初のテーブルには、実際には ~1k 行と ~30k 列があります)。

first.table=data.frame(Name=c('abc','def'),x=c(4,2),y=c(8,5),w=c(3,1),z=c(1,7))
second.table=data.frame(Name=c('abc','def'),Sub1=c('x','w'),Sub2=c('y','z'))
4

1 に答える 1

2

ほら:

library(reshape2)
# melt into long format
ldf <- melt(first.table,id.vars='Name')

# merge on Name and the Sub's
second.table <- merge(second.table,ldf,by.x=c('Name','Sub1'),by.y=c('Name','variable'))
second.table <- merge(second.table,ldf,by.x=c('Name','Sub2'),by.y=c('Name','variable'))

# rename columns to the correct values
colnames(second.table)[4:5] <- c('Sub1.Value','Sub2.Value')
于 2013-05-10T03:13:10.107 に答える