首页 文章

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

提问于
浏览
3

我有两个数据框如下:

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 回答

  • 1

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

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

    或者 base R 选项是在'df2' rowwise( do.call(paste )之后使用 match 获取数字索引,并使用 outer 获取 pastepaste 列名称和行名称 . 使用数字索引,我们得到'df1'中的值来创建'Newcol'

    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
    

相关问题