用另一个data.frame中的值替换data.frame中的值

时间:2014-11-28 17:06:29

标签: r dataframe

所以,我有这个data.frame,我们称之为df1,看起来像这样

   r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12
1   1  2  2  2  0  2  1  2  0   2   1   2
2   0  2  2  2  2  2  0  2  0   2   2   2
3   1  2  2  2  0  2  2  2  2   1   2   2
4   1  2  2  2  2  1  2  2  2   1   2   2
5   0  1  2  2  0  2  1  0  0   1   1   0
6   0  2  0  2  0  2  2  0  0   2   2   2
7   1  2  2  2  2  2  2  0  0   1   2   2
8   0  2  2  2  2  2  2  2  2   2   2   2
9   0  2  2  2  2  2  1  1  1   1   1   2

和一个,我们称之为df2,看起来像这样

         r1         r2             r3             r4            r5 ...
1 arp1_base melo1_base      son_clave     melo2_base   melo3_major ...
2   arp1_v1   melo1_v1    rumba_clave melo2_staccato   melo3_minor ...
3   arp1_v2   melo1_v2 rumba_clave_v1  melo2_contour melo3_contour ...

我没有粘贴所有列,但你明白了(是的,行数不同)。

现在我需要将第一个data.frame的每一列中的数字替换为匹配列的第二个data.frame中的值,并使用第一个data.frame中的数字作为第二个数据的行索引。帧。我想要的是一个新的data.frame,如下所示:

         r1         r2             r3 ...
1   arp1_v1   melo1_v2 rumba_clave_v1 ...
2 arp1_base   melo1_v2 rumba_clave_v1 ...
3   arp1_v1   melo1_v2 rumba_clave_v1 ...
.         .          .              .
.         .          .              .
.         .          .              .

我该怎么做?理想情况下,每个新列都是将三个名称保留为级别的因素。

顺便说一句,我觉得这是一个常见问题解答,但我面临着通常的n00b问题,不知道谷歌是什么。那周围有什么神奇的东西吗?

编辑根据@ akrun的建议,我可以df1[] <- Map(function(x, y) factor(y[x+1]), df1, df2),我得到的几乎是我想要的,因为df1的列现在是替换值,但我需要将这些因素中的每一个都设置为df2中相应列的所有值的水平。

1 个答案:

答案 0 :(得分:3)

尝试

  df1[] <- Map(function(x, y) y[x+1], df1, df2)
  df1
  #       r1       r2             r3            r4            r5
  #1   arp1_v1 melo1_v2 rumba_clave_v1 melo2_contour   melo3_major
  #2 arp1_base melo1_v2 rumba_clave_v1 melo2_contour melo3_contour
  #3   arp1_v1 melo1_v2 rumba_clave_v1 melo2_contour   melo3_major
  #4   arp1_v1 melo1_v2 rumba_clave_v1 melo2_contour melo3_contour
  #5 arp1_base melo1_v1 rumba_clave_v1 melo2_contour   melo3_major
  #6 arp1_base melo1_v2      son_clave melo2_contour   melo3_major
  #7   arp1_v1 melo1_v2 rumba_clave_v1 melo2_contour melo3_contour
  #8 arp1_base melo1_v2 rumba_clave_v1 melo2_contour melo3_contour
  #9 arp1_base melo1_v2 rumba_clave_v1 melo2_contour melo3_contour

更新

要创建factor列,其级别等于levels的相应列的df2

  df1[] <-  Map(function(x, y) factor(y[x+1], levels=unique(y)), df1, df2)
  levels(df1[,1])
  #[1] "arp1_base" "arp1_v1"   "arp1_v2"  

数据

 df1 <- structure(list(r1 = c(1L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L), r2 = c(2L, 
 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L), r3 = c(2L, 2L, 2L, 2L, 2L, 0L, 
 2L, 2L, 2L), r4 = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), r5 = c(0L, 
 2L, 0L, 2L, 0L, 0L, 2L, 2L, 2L)), .Names = c("r1", "r2", "r3", 
 "r4", "r5"), class = "data.frame", row.names = c("1", "2", "3", 
 "4", "5", "6", "7", "8", "9"))

 df2 <- structure(list(r1 = c("arp1_base", "arp1_v1", "arp1_v2"), 
  r2 = c("melo1_base", "melo1_v1", "melo1_v2"), r3 = c("son_clave",
  "rumba_clave", "rumba_clave_v1"), r4 = c("melo2_base", "melo2_staccato",
  "melo2_contour"), r5 = c("melo3_major","melo3_minor", "melo3_contour")),
 .Names = c("r1", "r2", "r3", "r4", "r5"), class = "data.frame", 
 row.names = c("1", "2", "3"))