用另一个数据框中的值替换数据框中的值

3

所以,我有一个数据框,我们称之为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 ...

我不会将所有列都粘贴在这里,但你可以了解到这个想法(是的,行数是不同的)。

现在,我需要用第二个数据框中与该列匹配的值替换第一个数据框中每一列中的数字,并使用第一个数据框中的数字作为第二个数据框中的行索引。我想要的是一个新的数据框,它将会像这样:

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

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,级别等于df2相应列的levels

  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"))

快了。现在我可以执行 factor(df1$r1, levels=df2$r1) 并获取我想要的列,那么我该如何将这个因子放回到 df1 中呢? - Morpheu5
@Morpheu5 不太确定我是否理解正确。也许是 df1[] <- Map(function(x, y) factor(y[x+1]), df1, df2) - akrun
是的,这样更好,但是你如何提取级别呢?让我们考虑df1 $ r1,它现在是一个因子,但我需要它的级别为c('arp1_base','arp1_v1','arp1_v2') - Morpheu5
@Morpheu5 好的,我现在明白了。 - akrun
太好了,这正是我所需要的 :) - Morpheu5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接