所以,我有这个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
中相应列的所有值的水平。
答案 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"))