![](/img/trans.png)
[英]R, replace values in a data.frame by values from another data.frame + dynamic columns
[英]Substitute values in a data.frame with values from another data.frame
所以,我有這個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的行索引。 我想要的是一個新的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
相應列的所有值作為級別。
嘗試
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"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.