将行名称和列名称与另一个数据框中的值匹配

时间:2017-01-31 06:57:11

标签: r

我有两个数据框如下:

df1 <- t(data.frame(seq(1,6,by=1),seq(6,1,by=-1)))    
colnames(df1) <- c("A","B","C","D","E","F)    
rownames(df1) <- c("a","b")    
df2 <- data.frame(rep(colnames(df1),2),rep(rownames(df1),6))    
colnames(df2) <- c("Vector1","Vector2")

这样

DF1

     A   B   C   D   E   F
  a  1   2   3   4   5   6
  b  6   5   4   3   2   1

DF2

   Vector1    Vector2
     A           a
     B           b
     C           a
     D           b
     E           a
     F           b
     A           a
     B           b
     C           a
     D           b
     E           a
     F           b

我想将df2的列值与df1的列名和行名匹配,并将相应的值填入df2中的新列,如下所示:

 Vector1 Vector2   Newcol
   A       a         1
   B       b         5
   C       a         3
   D       b         3
   E       a         5
   F       b         1
   A       a         1
   B       b         5
   C       a         3
   D       b         3
   E       a         5
   F       b         1

我们非常感谢任何建议。感谢。

1 个答案:

答案 0 :(得分:1)

我们可以将mergemelt一起使用。 melt返回三列data.framemerge与第二个数据集一起创建新列

library(reshape2)
merge(df2, melt(df1), by.x = c("Vector1", "Vector2"), by.y = c("Var2", "Var1"))

base R选项是在match&lt; df2&#39;之后获取paste的数字索引。按行(do.call(paste)并获取paste d列名称和行名称&#39; df1&#39;使用outer。使用数字索引,我们得到&#39; df1&#39;创建&#39; Newcol&#39;

df2$Newcol <- df1[match(do.call(paste, df2), 
                       t(outer(colnames(df1), rownames(df1), FUN = paste)))]
df2$Newcol
#[1] 1 5 3 3 5 1 1 5 3 3 5 1