如何通过R中的字典映射列

时间:2015-02-26 20:13:31

标签: r list dataframe

我在R中有一个数据框。此数据框的一列取值为1到6.我有另一个数据框映射此列。有一些方法可以替换此列中的值而不使用循环(使用某些函数)?

     [,1] [,2]   
[1,] "1"  "A"
[2,] "2"  "B"
[3,] "3"  "C"
[4,] "4"  "D"

[1] 4 2 2 3 4 1 4 4

是否存在一个函数,它返回下面的向量而不使用循环?

[1] D B B C D A D D

2 个答案:

答案 0 :(得分:1)

你可以尝试

v1 <- c(4, 2, 2, 3, 4, 1, 4, 4)
LETTERS[v1]
#[1] "D" "B" "B" "C" "D" "A" "D" "D"

假设您的地图数据集第2列不仅仅是&#34; LETTERS&#34;

d1 <- data.frame(Col1=c(1,3,4,2), Col2=c('j1', 'c9', '19f', 'd18'),
                     stringsAsFactors=FALSE)

unname(setNames(d1[,2], d1[,1])[as.character(v1)])
#[1] "19f" "d18" "d18" "c9"  "19f" "j1"  "19f" "19f"

或者

d1$Col2[match(v1, d1$Col1)]
#[1] "19f" "d18" "d18" "c9"  "19f" "j1"  "19f" "19f"

答案 1 :(得分:0)

要使用此类型的地图/字典来创建新的数据框列,您还可以使用匹配方法:

snape_gradebook_df<-data_frame(students=c("Harry", "Hermione", "Ron", "Neville", "Ginny", "Luna", "Draco", "Cho"),
           numeric_grade=c(4,2,2,3,4,1,4,4))
grade_map<-data_frame(numbers=c(1,2,3,4), letters=c("A", "B", "C", "D"),
                    stringsAsFactors = FALSE)
snape_gradebook_df['letter_grade']<-grade_map$letters[match(old_list, grade_map$numbers)]

我不确定setNames vs match的优点/缺点 - 只是想我会分享另一种可能的解决方案。