Сравните несколько столбцов в 2 разных фреймах данных в R - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь сравнить несколько столбцов в двух разных фреймах данных в R. Это уже обсуждалось ранее на форуме ( Сравнить группу из двух столбцов и совпадения индекса возврата R ), но это другой сценарий:Я пытаюсь сравнить, если столбец в dataframe 1 находится в диапазоне от 2 столбцов в dataframe 2.Такие функции, как match, merge, join, intersect не будут работать здесь.Я пытался использовать purr::pluck, но не получил далеко.Фреймы данных имеют разные размеры.

Ниже приведен пример:

temp1.df <- mtcars

temp2.df <- data.frame(
  Cyl = sample (4:8, 100, replace = TRUE),
  Start = sample (1:22, 100, replace = TRUE),
  End = sample (1:22, 100, replace = TRUE)
)

temp1.df$cyl <- as.character(temp1.df$cyl)
temp2.df$Cyl <- as.character(temp2.df$Cyl)

Моя попытка:

temp1.df <- temp1.df %>% mutate (new_mpg = case_when (
  temp1.df$cyl %in% temp2.df$Cyl & temp2.df$Start <= temp1.df$mpg & temp2.df$End >= temp1.df$mpg ~ 1
))

Ошибка:

Error in mutate_impl(.data, dots) : 
  Column `new_mpg` must be length 32 (the number of rows) or one, not 100

Ожидаемый результат:

  1. Сравнить temp1.df $ cyl и temp2.df $ Cyl.Если они совпадают, то ->
  2. Проверьте, находится ли temp1.df $ mpg между temp2.df $ Start и temp2.df $ End ->
  3. , если это так, затем создайтеnew переменная new_mpg со значением 1.

Трудно показать точный ожидаемый результат здесь.

Я понимаю, что могу сделать это так для каждой строки temp1.dfно оригинал temp2.df имеет более 250 000 строк.Эффективное решение будет высоко ценится.

Спасибо

1 Ответ

0 голосов
/ 14 ноября 2018
temp1.df$new_mpg<-apply(temp1.df, 1, function(x) {
  temp<-temp2.df[temp2.df$Cyl==x[2],] 
  ifelse(any(apply(temp, 1, function(y) {
    dplyr::between(as.numeric(x[1]),as.numeric(y[2]),as.numeric(y[3]))
  })),1,0)
})

Обратите внимание, что это делает некоторые предположения об организации ваших фактических данных (в частности, я не могу назвать имена столбцов в пределах apply, поэтому я использую индексы - которые могут очень хорошо измениться,так что вы можете захотеть переставить ваши данные между получением и вызовом apply, или, возможно, измените организацию в пределах apply, например, на apply(temp1.df[,c("mpg","cyl")]....

В любом случае, это нарушит ваши данныеустанавливается в строки, и каждая строка сравнивается с подмножеством второго набора данных с тем же числом Cyl. Внутри этого подмножества оно проверяет, падает ли any MPG для этой строки between (из dplyr) Start и End, и возвращает 1, если да (или 0, если нет). Все эти единицы и нули затем возвращаются как (именованный) вектор, который может быть помещен в temp1.df$new_mpg.

IЯ предполагаю, что есть способ сделать это с rowwise, но я никогда не смогу заставить его работать должным образом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...