2017-01-20 14 views
1

У меня есть два кадра данных:Перекодировать данные в двух данных с помощью R

data1 <- as.data.frame(matrix(0, ncol = 2, nrow = 5)) 
data1$V1 <- c("AA", "BB", "CC", "DD", "EE") 
data1$V2 <- c(1, 2, 3, 4, 5) 

> data1 
    V1 V2 
1 AA 1 
2 BB 2 
3 CC 3 
4 DD 4 
5 EE 5 

data2 <- as.data.frame(matrix(0, ncol = 2, nrow = 9)) 
data2$V1 <- c("AA", "AA", "AA", "BB", "BB","BB","CC","CC","DD") 
data2$V2 <- c("BB", "CC", "EE", "CC", "DD","EE","DD","EE","EE") 

> data2 
    V1 V2 
1 AA BB 
2 AA CC 
3 AA EE 
4 BB CC 
5 BB DD 
6 BB EE 
7 CC DD 
8 CC EE 
9 DD EE 

Я хочу, чтобы перекодировать все значения в «data2» dataframe на основе значений dataframe «. Data1' Ожидаемый результат заключается в следующем;

> data3 
V1 V2 
1 1 2 
2 1 3 
3 1 5 
4 2 3 
5 2 4 
6 2 5 
7 3 4 
8 3 5 
9 4 5 

В моем реальном наборе данных„data1“dataframe бы имеют 100 000 рядов строк с уникальными значениями.

Я нашел несколько примеров с пакетом «plyr» с функциями «mapvalue()», «revalue()», которые, как я думаю, могут использоваться для пересчета значений в единых кадрах данных. Но не смог найти эффективный метод, чтобы делать то, что я хочу.

+2

'data2 [] <- lapply (data2, function (x) {setNames (data1 $ V2, data1 $ V1) [x]})' или с dplyr, 'data2%>% mutate_all (funs (setNames (data1 $ V2, data1 $ V1) [.])) ' – alistaire

+0

[Чтение при поиске таблицы] (http://adv-r.had.co.nz/Subsetting.html#applications) – alistaire

+0

Спасибо за ваше решение, это сработало для меня. – Anna

ответ

1

Мы можем сделать это с помощью base R путем создания вектора ключ/значение из «data1» для заполнения значений в «data2»

data2[] <- setNames(data1$V2, data1$V1)[as.matrix(data2)] 
data2 
# V1 V2 
#1 1 2 
#2 1 3 
#3 1 5 
#4 2 3 
#5 2 4 
#6 2 5 
#7 3 4 
#8 3 5 
#9 4 5 

Или мы можем использовать dplyr с match

library(dplyr) 
data2 %>% 
     mutate_each(funs(data1$V2[match(., data1$V1)])) 
# V1 V2 
#1 1 2 
#2 1 3 
#3 1 5 
#4 2 3 
#5 2 4 
#6 2 5 
#7 3 4 
#8 3 5 
#9 4 5