Сравнить с df и заполнить col на основе совпадающих строк

#r #dplyr

#r #dplyr

Вопрос:

У меня есть два df, которые выглядят так,

 id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
a <- cbind(OS, id1, id2) 
a
  
 i1<-c(2,2,2,4,3)
i2<-c(4,4,5,2,3)
OSi<-c(1,2,3,4,5)
b <- cbind(OSi, i1, i2) 
  

Я хочу создать новый col (x) с «0», где совпадают $ OS и $ OSi (т. е. 1->1, 2->2) но только там, где последующие два столбца в каждом df совпадают, и «1», где они не совпадают.
Мой желаемый результат выглядит примерно так:

 id1<-c(2,2,2,1,3)
id2<-c(4,4,5,2,3)
OS<-c(1,2,3,4,5)
x <-c(0,0,0,1,0)
a <- cbind(OS, id1, id2, x) 
a
  

Я до сих пор пробовал это:

 a$x <- case_when(a$OS %in% b$OSi amp;
                     a$id1 %in% b$I1 amp; 
                     b$id2 %in% b$I2 ~ '0') %>%
  replace_na('1')
  

Тем не менее, я нахожу, что Case_when здесь удовлетворяет только первому аргументу. (т. Е. Отношение 0/1 изменяется в зависимости от порядка переменных).

Кроме того, приведенное выше является верхним df. Мои фактические данные составляют ~ 10000 строк, а b длиннее, чем a. Я также могу захотеть удалить любые строки не в a, а в b.

Надеюсь, это достаточно ясно. Я предпочитаю интегрировать в каналы!

Приветствия!

Ответ №1:

Работает ли это:

 > id1<-c(2,2,2,1,3)
> id2<-c(4,4,5,2,3)
> OS<-c(1,2,3,4,5)
> a <- data.frame(OS, id1, id2) 
> 
> 
> i1<-c(2,2,2,4,3)
> i2<-c(4,4,5,2,3)
> OSi<-c(1,2,3,4,5)
> b <- data.frame(OSi, i1, i2) 
> 
> 
> transform(a %>% inner_join(b, by = c('OS' = 'OSi')), x = ifelse((id1 == i1) amp; (id2 == i2), 0, 1)) %>% select(OS, id1, id2, x)
  OS id1 id2 x
1  1   2   4 0
2  2   2   4 0
3  3   2   5 0
4  4   1   2 1
5  5   3   3 0
> 
  

Я использовал inner_join, поэтому мы объединяемся на основе вашего первого условия a $ OS == b $ OSi

Комментарии:

1. Я не думаю, что смогу связать df, потому что они разной длины: Ошибка в data.frame(…, check.names = FALSE) : аргументы подразумевают разное количество строк: 7625, 8996

2. Хорошо, предположил, что это так из ваших выборочных данных. Итак, перекрываются ли OS и OSi? Могут ли они использоваться в качестве первичного ключа и внешнего ключа в этом случае? Если да, то какая ваша основная таблица, я предполагаю, что это «a»?

3. Изменили код, не могли бы вы проверить, работает ли это?

4. Привет, Картик, спасибо за это, но это не совсем работает. Я не уверен, почему, но это дает мне меньше положительных (1) результатов, чем я ожидаю.

5. Хорошо, не могли бы вы, пожалуйста, включить части, в которых вы не получаете ожидаемый результат, в свой образец данных выше? При наличии всего 5 строк в образце данных может быть сложно визуализировать проблему.