2015-06-04 2 views
4

Я хочу определить строки, присутствующие в dataframe1, которые отсутствуют в dataframe2 на основе определенного столбца. Я использовал приведенный ниже код, чтобы получить нужную информацию.Не применимый метод для «anti_join», примененный к объекту класса «factor»

diffId <- anti_join(dat$ID,datwe$ID) 

К сожалению, я столкнулся с ошибкой:

Error in UseMethod("anti_join") :
no applicable method for 'anti_join' applied to an object of class "factor"

Я проверил класс нужной колонки в обоих dataframes и который оказался factor. Также попытались разделить столбец на отдельную переменную в предположении, что она может решить проблему, но не повезло!

fac1 <- datwe$ID 
fac2 <- dat$ID 
diffId <- anti_join(fac2,fac1) 

Не могли бы вы поделиться своими мыслями?

Благодаря

+0

Я не понимаю, что это неправильно (downvote) в процессе обучения на ошибках. – Prradep

+0

Правильный тег - data.frame, а не dataframes, fyi. (Я уже редактировал.) – Frank

ответ

2

Почти все dplyr функции работают на tbls (в зависимости от контекста, это может быть data.frame, data.table, подключение к базе данных и так далее), так что вы действительно хотите что-то вроде этого:

> dat <- data.frame(ID=c(1, 3, 6, 4), x=runif(4)) 
> datwe <- data.frame(ID=c(3, 5, 8), y=runif(3)) 
> anti_join(dat, datwe, by='ID') %>% select(ID) 
    ID 
1 4 
2 6 
3 1 

Обратите внимание, что порядок явно не сохраняется.

Если вы используете факторы (в отличие от цифр в приведенном выше примере) с разными уровнями, происходит конверсия между factor и character.

Если вы хотите работать с векторами, то вы можете использовать setdiff (доступный в обоих base и dplyr)

> setdiff(dat$ID, datwe$ID) 
[1] 1 6 4 
+0

Спасибо @ zero323. Он работал с вышеупомянутым предложением. (Я буду держать этот поток открытым какое-то время, чтобы изучить другие методы выполнения этой задачи и отметить это как ответ) Не могли бы вы объяснить, почему это не сработало, когда был только один столбец? – Prradep

+0

Он отлично работает, если есть только одна колонка. Проблема заключается в том, что 'dat $ ID' больше не' data.frame', а вектор. – zero323

+0

О, 'anti_join' может использоваться только для' data.frame'. Благодаря ! – Prradep

Смежные вопросы

 Смежные вопросы