2017-01-30 2 views
0

У меня есть две таблицы, оба имеют следующие поля:DPLYR искать или присоединяться? Как подойти к этому?

  • Дата
  • ID
  • овощи
  • фрукты
  • Метрика

df2 является подмножеством df1. df1 имеет ~ 8k записей, а df2 имеет около 4k.

Моя цель - либо создать новый df, либо добавить столбец в родительский фрейм данных df1 с истинным/ложным для того, выходит ли комбинация даты/идентификатора в df2. Поиск в основном.

Должен ли я идти по маршруту поиска или мне нужно создать новый фрейм данных, присоединив df1 и 2?

Я не могу присоединиться только к id, должен быть комбинацией идентификатора и даты, поскольку некоторые идентификаторы возвращаются в разные даты.

Я попытался left_join()

comb <- left_join(x = df1, y = df2, by=c("date", "id")) 

Но результат, возвращаемый столбцы для фруктов и овощей для обоих, когда я на самом деле просто хотел сохранить df1 колонки:

  • Дата
  • ID
  • овощи .x
  • fruits.x
  • metric.x
  • vegetables.y
  • fruits.y
  • metric.y

То, что я хочу, это просто:

  • Дата
  • ID
  • овощи
  • фрукты
  • InDF2 (булево)
  • метрика

Что является лучшим способом, чтобы определить, какие строки (дата + идентификатор) в df1 также существуют в df2 (дата + идентификатор)?

ответ

1
  1. Может pastedate и id в вектор для каждого df, скажем df1_vector и df2_vector
  2. Использование %in%
  3. Попробуйте df1$df2_presence_check = paste(df1$date,df1$id) %in% paste(df2$date,df2$id)

Пример

set.seed(42) 
a = sample(letters, 5) 
b = sample(letters,15) 
a %in% b 
#[1] FALSE FALSE TRUE TRUE TRUE 

#OR 

b %in% a 
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE 
+1

Это сделал трюк поблагодарить вас за предложение, использовали это в сочетании с мутировать(), чтобы добавить новый колонка. –

1

Вот решение полностью в dplyr. Я предполагаю, что id и date представляют и уникальный ключ.

Давайте добавим некоторые данные для Воспроизводимости

set.seed(23489) 
n <- 10 

df1 <- data.frame(
    id=sample(1e4:9e4, n), 
    date=sample(seq(as.Date('2015/01/01'), as.Date('2017/01/01'), by="day"), n), 
    vegetables= c("Broccoli", "Cabbage", "Calabrese", "Carrots", "Cauliflower", 
       "Celery", "Chard", "Endive", "Fiddleheads", "Frisee"), 
    fruits=c("Jabuticaba", "Jackfruit", "Jambul", "Jujube", "Juniper berry", 
      "Kiwi", "Kumquat", "Lemon", "Lime", "Loquat"), 
    metric=rnorm(n=n) 
) 

df2 <- df1[sample(seq_len(nrow(df1)), n/2), ] 

Далее мы создаем свой желаемый результат

df1 %>% 
    left_join(select(mutate(df2, InDF2=TRUE), id, date, InDF2), by=c("id", "date")) %>% 
    mutate(InDF2=ifelse(is.na(InDF2), FALSE, TRUE)) 

#  id  date vegetables  fruits  metric InDF2 
# 1 80283 2016-11-26 Broccoli Jabuticaba 1.68765979 FALSE 
# 2 14766 2016-10-18  Cabbage  Jackfruit -0.16774908 FALSE 
# 3 19532 2015-03-29 Calabrese  Jambul -1.18328968 TRUE 
# 4 46187 2015-03-09  Carrots  Jujube 1.83044569 FALSE 
# 5 76852 2016-01-11 Cauliflower Juniper berry -0.05744373 FALSE 
# 6 45507 2015-10-27  Celery   Kiwi -1.78166251 FALSE 
# 7 65227 2016-07-07  Chard  Kumquat -1.84756162 TRUE 
# 8 71433 2015-05-25  Endive   Lemon 0.77346596 TRUE 
# 9 17002 2016-10-22 Fiddleheads   Lime 1.09118108 TRUE 
# 10 52797 2015-06-29  Frisee  Loquat -0.46491328 TRUE