2015-02-26 5 views
4

У меня есть кадр данных в R. Один столбец этого фрейма данных принимает значения от 1 до 6. У меня есть другой фрейм данных, который отображает этот столбец. Можно каким-то образом заменить значения в этом столбце, не используя циклы (используя некоторую функцию)?Как сопоставить столбцы через словарь в R

 [,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 

ответ

1

Вы можете попробовать

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

Предположим, если ваше отображение набора данных второго столбца не просто "БУКВЫ"

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

Чтобы использовать этот тип map/dictionary для создания новых данных меня колонка, вы можете также использовать метод соответствия:

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 против матча - просто думал, что я хотел бы поделиться еще одно возможное решение.