2016-04-25 3 views
2

У меня есть фрейм данных (x) с переменной множителем, который имеет значения, разделенные запятой. У меня есть другой фрейм данных (y) с описанием для тех же значений. Теперь я хочу заменить значения в кадре данных (x) описанием из фрейма данных (y). Любая помощь будет высоко оценен.Заменить значение из другого фрейма данных

говорят, например, два фрейма данных выглядит, как показано ниже

data frame (x) 
    s.no x 
    1  2,5,45 
    2  35,5 
    3  45 

data fram (y) 
s.no x description 
1  2  a 
2  5  b 
3  45  c 
4  35  d 

Мне нужен выход, как показано ниже

s.no x 
1  a,b,c 
2  d,b 
c  c 

ответ

3

Мы можем split столбец «х» в «х» набор данных по ' , ', петля над list, сопоставьте значение с столбцом' x 'в' y ', чтобы получить числовой индекс, получить соответствующее значение' description 'от' y 'и paste вместе.

x$x <- sapply(strsplit(x$x, ","), function(z) 
      toString(y$description[match(as.numeric(z), y$x)])) 

x 
# s.no  x 
#1 1 a, b, c 
#2 2 d, b 
#3 3  c 

Примечание: Если столбец 'х' в 'х' factor класс, используйте strsplit(as.character(x$x, ","))

+1

извините, не видел вас там. Удалил мой, поскольку он очень похож. Никто никогда не видел тебя ... Ты как ниндзя :) – Sotos

+0

@Sotos Нет проблем. Вы можете придумать еще одну идею с 'mgsub' или что-то вроде этого – akrun

+0

Это из' qdap'? ... Я не могу заставить этот пакет работать ... – Sotos

5

С splitstackshape:

library(splitstackshape) 

cSplit(x, 'x', ',', 'long')[setDT(y), on='x'][,.(x=paste(description, collapse=',')), s.no] 

# s.no  x 
#1: 1 a,b,c 
#2: 2 b,d 
#3: 3  c 
+0

При использовании пакета 'splitstackshape' использование' setDT' необязательно. – h3rm4n

+0

thks для указания этого, сейчас один лайнер :) –

4

Раствор с помощью dplyr и tidyr:

library(dplyr) 
library(tidyr) 
x %>% 
    separate(x, paste0('x',1:3),',',convert=TRUE) %>% 
    gather(var, x, -1, na.rm=TRUE) %>% 
    left_join(., y, by='x') %>% 
    group_by(s.no = s.no.x) %>% 
    summarise(x = paste(description,collapse = ',')) 

результат:

s.no  x 
    (int) (chr) 
1  1 a,b,c 
2  2 d,b 
3  3  c 
+0

вы понимаете, что вы опубликовали, это всего лишь копия моего решения? –

+0

@ColonelBeauvel Не видел его до того, как я отправил сообщение. Я удалил решение 'cSplit'. – h3rm4n

+0

хорошее решение с dplyr, +1 –

Смежные вопросы