R - Найти подходящие строки из разных фреймов данных - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть фрейм данных с дебетовыми или кредитовыми записями.Кредитные записи имеют точное совпадение при дебете.Мне нужно удалить кредит и связанную дебетовую запись из моего фрейма данных.

Проблема в том, что записи не являются уникальными, поэтому я не хочу удалять все соответствующие записи, только одну.(так что анти-объединение невозможно).Значения в строках являются точным совпадением, и они имеют одинаковые столбцы.

Мой подход заключался в разделении фрейма данных на «дебит» -датафрейм (ddc) и «кредит»-датафрейм (dcc) .Теперь переберите каждую строку в блоке credit-data, найдите соответствующую строку в debit-dataframe и удалите это.Обратите внимание, что они должны совпадать по нескольким столбцам.

Когда я пытаюсь использовать функцию соответствия, она продолжает вычислять, и я чувствую, что она не работает.Теперь я пытаюсь:

ddc <- ddc[!(ddc[match(dcc[1,],ddc),]),]

Я стремлюсь к следующему:

for(i in 1:nrow(dcc)){
ddc <- ddc[!(ddc[match(dcc[i,],ddc),]),]
}

Результатом должен быть кадр debit-data, в котором по одному совпадению каждой строки в кадре credit-dataудален.Таким образом, если ddc имеет 10 строк и dcc 2 строки, новый ddc будет иметь 8 строк.

Любая помощь приветствуется!

Пример данных:

dcc               ddc                    new ddc

x1 x2 x3 x4 x5     x1  x2  x3  x4  x5     x1  x2  x3  x4  x5
1  2  3  5  6      1   2   2   3   5      1    2   2   3   5
1  3  2  3  5      1   2   3   3   3      1    2   3   3   3 
1  2  3  5  6      1   2   2   3   5      1    2   2   3   5
1  5  6  7  3      1   5   5   2   3      1    5   5   2   3 
                   1   3   2   3   5      1    3   2   3   5
                   1   2   3   5   6
                   1   3   2   3   5
                   1   5   6   7   3

1 Ответ

0 голосов
/ 06 декабря 2018

Я бы использовал anti_join, как Джонни Фелпс , упомянутый в комментариях выше, однако я бы сначала добавил какой-то столбец рейтинга, чтобы убедиться, что я сохранил дубликаты, вот что я предлагаю:

# read the data
dcc <- read.table(text = 'x1 x2 x3 x4 x5    
1  2  3  5  6      
1  3  2  3  5      
1  2  3  5  6      
1  5  6  7  3 ', header = TRUE)

ddc <- read.table(text = 'x1  x2  x3  x4  x5     
1   2   2   3   5     
1   2   3   3   3      
1   2   2   3   5      
1   5   5   2   3      
1   3   2   3   5      
1   2   3   5   6
1   3   2   3   5
1   5   6   7   3', header = TRUE)

# Add the ranking column in ddc
ddc <- ddc %>% 
  group_by_all() %>% 
  mutate(rank_row = row_number()) %>% 
  ungroup()
# Add a dummy ranking column in dcc, which is always = 1
dcc <- dcc %>% mutate(rank_row = 1)

# and now the anti_join by = c("x1", "x2", "x3", "x4", "x5", "rank_row") or by = names(ddc)
anti_join(ddc, dcc, by = names(ddc))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...