возврат совпадающего значения с использованием расплава

Вход

listofstring <- c("Mac","Windows","Linux","Android")
test <- data.frame(query = c("I love Mac","I love Ubuntu","I love Android","I love both Android and Linux"), numerical_val = c(20,30,40,50))

В настоящее время я использую следующий метод, который дает мне желаемый результат:

library(stringr)
melt(setNames(lapply(str_extract_all(test$query, 
      paste(listofstring,collapse="|")), function(x)
      if(length(x)==0) NA else x), test$query))[2:1]
#                            ind  values
#1                    I love Mac     Mac
#2                 I love Ubuntu    <NA>
#3                I love Android Android
#4 I love both Android and Linux Android
#5 I love both Android and Linux   Linux

ТАК, это мой желаемый результат, и я тоже его получаю.

Теперь я также хочу включить numerical_val в вывод. поэтому вывод будет таким

#                            ind  values numerical_val
#1                    I love Mac     Mac      20
#2                 I love Ubuntu    <NA>      30
#3                I love Android Android      40
#4 I love both Android and Linux Android      50
#5 I love both Android and Linux   Linux      50

Может ли кто-нибудь помочь мне изменить мой текущий метод. Или может указать мне лучший метод?

Обратите внимание, что набор данных очень-очень большой, и текущий метод довольно плавный.


person vk087    schedule 29.04.2016    source источник
comment
ты пробовал merge?   -  person Sotos    schedule 29.04.2016
comment
Можешь ли ты показать мне ? Я пробовал ваш более ранний метод, и для моих данных буквально требуются часы.   -  person vk087    schedule 29.04.2016


Ответы (1)


Предполагая, что ваш результирующий фрейм данных называется test1,

library(dplyr)
names(test)[names(test)=='query'] <- 'ind'
inner_join(test, test1, by = 'ind')
#                            ind numerical_val  values
#1                    I love Mac            20     Mac
#2                 I love Ubuntu            30    <NA>
#3                I love Android            40 Android
#4 I love both Android and Linux            50 Android
#5 I love both Android and Linux            50   Linux

В качестве альтернативы data.table может быть более эффективным,

setDT(test)[test1, on="ind"]
person Sotos    schedule 29.04.2016
comment
Вы пробовали использовать пакет data.table для merge? Это быстрее, чем data.frames, и может ускорить код. - person Kumar Manglam; 29.04.2016
comment
Спасибо @KumarManglam. Вообще-то я собирался опубликовать data.table, но застрял на другом вопросе :) - person Sotos; 29.04.2016