Создайте столбец «flag» в наборе данных на основе другой таблицы в R - PullRequest
1 голос
/ 09 марта 2020

У меня есть два набора данных: dataset1 и dataset2.

zz <- "id_customer id_order order_date
1 1 2018-10
1 2 2018-11
2 3 2019-05
3 4 2019-06"

dataset1 <- read.table(text=zz, header=TRUE)

yy <- "id_customer order_date
1 2018-10
3 2019-06"

dataset2 <- read.table(text=yy, header=TRUE)

dataset2 - это результат запроса, в котором у меня есть два столбца: id_customer и date (формат YYYY -mm). Они соответствуют клиентам, которые имеют статус, отличный от других в исходном наборе данных (dataset1), за указанный месяц.

dataset1 - это список транзакций, в которых у меня есть id_customer, id_order и date (также в формате YYYY-mm). Я хочу дополнить dataset1 столбцом «флаг» для каждой строки, установленной в 1, если идентификатор клиента появляется в dataset2 в течение соответствующего месяца.

Я пробовал что-то следующим образом:

dataset$flag <- ifelse(dataset1$id_customer %in% dataset2$id_customer &
                         dataset1$date == dataset2$date,
                       "1", "0")

Но я получаю предупреждающее сообщение, в котором говорится, что «большая длина объекта не кратна короткой длине объекта». Я понимаю это, но не могу найти решение. Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Вы можете добавить флаг в набор данных2, а затем использовать merge(), сохраняя все строки из набора данных1. Заимствование данных Криса:

dataset2$flag <- 1
merge(dataset1, dataset2, all.x = TRUE)

   ID    Date flag
1   1 2018-12   NA
2   1 2019-11   NA
3   2 2018-13   NA
4   2 2019-10   NA
5   2 2019-11    1
6   2 2019-12   NA
7   2 2019-12   NA
8   3 2018-12    1
9   3 2018-12    1
10  4 2018-13    1
0 голосов
/ 09 марта 2020

РЕДАКТИРОВАТЬ : Это похоже на работу:

Иллюстративные данные :

set.seed(100)
dt1 <- data.frame(
  ID = sample(1:4, 10, replace = T),
  Date = paste0(sample(2018:2019, 10, replace = T),"-", sample(10:13, 10, replace = T))
)
dt1
   ID    Date
1   2 2019-12
2   2 2019-12
3   3 2018-12
4   1 2018-12
5   2 2019-11
6   2 2019-10
7   4 2018-13
8   2 2018-13
9   3 2018-12
10  1 2019-11

dt2 <- data.frame(
  ID = sample(1:4, 5, replace = T),
  Date = paste0(sample(2018:2019, 5, replace = T),"-", sample(10:13, 5, replace = T))
)
dt2
  ID    Date
1  2 2019-11
2  4 2018-13
3  2 2019-13
4  4 2019-13
5  3 2018-12

РЕШЕНИЕ :

Решение использует ifelse для определения условия, при котором устанавливается «флаг» 1 (как указано в OP). Это условие подразумевает совпадение между dt1 и dt2; таким образом мы используем match. Осложняющим фактором является то, что условие требует совпадения double между двумя столбцами в каждом кадре данных. Поэтому мы используем apply для вставки строк в два столбца вместе, используя paste0 и ищем совпадения в следующих составных строках:

dt1$flag <- ifelse(match(apply(dt1[,1:2], 1, paste0, collapse = " "), 
                         apply(dt2[,1:2], 1, paste0, collapse = " ")), 1, "NA")

RESULT :

dt1
   ID    Date flag
1   2 2019-12   NA
2   2 2019-12   NA
3   3 2018-12    1
4   1 2018-12   NA
5   2 2019-11    1
6   2 2019-10   NA
7   4 2018-13    1
8   2 2018-13   NA
9   3 2018-12    1
10  1 2019-11   NA

Чтобы проверить результаты, мы можем сравнить их с результатами, полученными из merge:

flagged_only <- merge(dt1, dt2)

flagged_only
  ID    Date
1  2 2019-11
2  3 2018-12
3  3 2018-12
4  4 2018-13

Кадр данных flagged_only содержит в точности те же четыре строки, что и отмеченные 1 в dt1 - вуаля!

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