Я не уверен, почему intersect()
и setdiff()
из Шпаргалки по преобразованию данных возвращают мне ошибки. Я просмотрел другие ответы и не нашел ответа. Любая помощь могла бы быть полезна!
Воспроизводимый пример
Я использую library(tidyverse)
и library(plyr)
(которые, как мне кажется, включены в tidyverse
, но, пытаясь выяснить ошибку, я загрузил пакет все равно). Я также использую lubridate
для другой части моего кода, поэтому я добавил его. В моих реальных данных у меня есть много избыточных значений в столбце «code» каждой таблицы, поэтому я добавил повторяющиеся значения и передал distinct()
по конвейеру, чтобы воспроизвести структуру, которая у меня ниже.
library(tidyverse)
library(plyr)
library(lubridate)
# x table
x <- tibble(code = c(1,2,2)) %>%
distinct(code)
# y table
y <- tibble(code = c(2,3,3)) %>%
distinct(code)
intersect()
: я хочу использовать intersect()
для создания таблицы значений в x, которые также находятся в y: 2
. Я обнаружил, что join()
работает, но если кто-нибудь может поделиться, почему то, что у меня есть, не возвращает 2
, я был бы признателен.
# this produces error message "Length of logical index must be 1 or 2, not 0"
intersect(x, y)
# but this seems to work and returns a table with `2` which is what I want
intersect_solution <- join(x, y, type = "inner")
setdiff()
: Я хочу использовать setdiff()
для создания таблицы значений в x, которых нет в y: 1
. Я застрял здесь и совершенно не понимаю, почему это не работает.
# this produces all of x: `1` and `2`
setdiff(x, y)
Изменения в вопросе: В моем коде была опечатка, и я исправил ее. Дальнейшие дополнения ниже:
- пересечение (left.df, right.df) изменено на пересечение (x, y)
- setdiff (left.df, right.df) изменено на setdiff (x, y)
- добавил
library(lubridate)
в пример, потому что я его использую