Как отфильтровать результаты на основе зависимостей между двумя столбцами в одной таблице и результатов из другой таблицы в R? - PullRequest
1 голос
/ 09 апреля 2020

Мне интересно, есть ли способ (функция или несколько элегантных строк кода), который может помочь мне отфильтровать результаты с этой проблемной структурой фрейма данных / зависимостью столбца.

У меня есть сценарий, в котором у меня есть функции, которые сильно коррелируют друг с другом (например, таблица 1).
У меня также есть отдельная таблица, в которой перечислены другие оценки для каждого отдельного объекта (например, таблица 2).

Таблица 1:

feature1, feature2, feature_correlation_score  
a, b, 0.7      
c, d, 0.5  
b, a, 0.7   
d, c, 0.5     
e, f, 0.8,  
f, e, 0.8 

Таблица 2:

feature, label_correlation_score       
a, 0.20    
b, 0.15    
c, 0.08   
d, 0.04  
e, 0.02   
f, 0.02    

Что я хочу сделать is:
(1) Укажите каждую уникальную пару feature1 и feature2 (т. е. a, b и b, a одинаковые).
(2 ) Затем изучите значение label_correlation_score из таблицы 2 для каждого значения в паре и сохраните только свойство, имеющее наивысший label_correlation_score между каждой уникальной парой.
(3) Сохраните результаты в новой таблице, которая выглядит следующим образом:

Финальный стол:

feature, label_correlation_score  
a, 0.20  
c, 0.08  
e, 0.02

Примечание: это может быть либо e или f выбран в последнем ряду, потому что их label_correlation_scores одинаковы.

Заранее спасибо!

Редактировать: Мне также интересно, каким будет эквивалентный код, использующий data.table.

1 Ответ

1 голос
/ 09 апреля 2020

Если вы в порядке с tidyverse, вот один подход.

  • Во-первых, мы сохраняем только те строки, для которых feature1 меньше feature2, таким образом удаляя дубликаты (предполагается, что обе версии всегда доступны).
  • Затем мы объединяем label_correlation_score для feature1 и feature2 (с суффиксами столбцов _1 и _2 соответственно).
  • Затем мы сохраняем наибольшее количество баллов в столбце label_correlation_score и соответствующую ему функцию в столбце feature.
  • Наконец, мы сохраняем только столбцы feature и label_correlation_score.
library(tidyverse)

df1 <- read_csv("feature1, feature2, feature_correlation_score
a, b, 0.7
c, d, 0.5
b, a, 0.7
d, c, 0.5
e, f, 0.8,
f, e, 0.8")

df2 <- read_csv("feature, label_correlation_score
a, 0.20
b, 0.15
c, 0.08
d, 0.04
e, 0.02
f, 0.02 ")

df1 %>% 
  filter(feature1 < feature2) %>% 
  left_join(df2, by = c("feature1" = "feature")) %>% 
  left_join(df2, by = c("feature2" = "feature"), suffix = c("_1", "_2")) %>% 
  mutate(label_correlation_score = pmax(label_correlation_score_1, label_correlation_score_2),
         feature = if_else(label_correlation_score_1 > label_correlation_score_2, feature1, feature2)) %>% 
  select(feature, label_correlation_score)

, что дает

# A tibble: 3 x 2
  feature label_correlation_score
  <chr>                     <dbl>
1 a                          0.2 
2 c                          0.08
3 f                          0.02
...