Как создать цикл for на основе уникальных идентификаторов пользователя и определенных типов событий - PullRequest
0 голосов
/ 06 июня 2018

У меня есть два фрейма данных: users и events.

Оба фрейма данных содержат поле, связывающее события с пользователями.

Как создать цикл forгде уникальный идентификатор каждого пользователя сопоставляется с событием определенного типа, а затем сохраняет количество вхождений в новый столбец внутри пользователей (users$conversation_started, users$conversation_missed и т. д.)?

Короче говоря, оноявляется условным для цикла.

Пока у меня есть это, но это неправильно:

for(i in users$id){
  users$conversation_started <- nrow(event[event$type = "conversation-started"])
}

Пример того, как это сделать, был бы идеальным.

Идеяis:

for(each user)
    find the matching user ID in events
    count the number of event types == "conversation-started"
    assign count value to user$conversation_started
end for

Важное примечание:

Поле type может содержать одно из пяти значений, поэтому мне потребуется возможность эффективно фильтровать каждое type для каждого сотрудника:

> events$type %>% table %>% as.matrix
                           [,1]
conversation-accepted          3120
conversation-already-accepted 19673
conversation-declined            27
conversation-missed             831
conversation-request          23427

Кадры данных (обратите внимание, что это сокращенные версии, поскольку конфиденциальная информация была удалена):

users <- structure(list(`_id` = c("JTuXhdI4Ai", "iGIeCEXyVE", "6XFtOJh0bD", 
"mNN986oQv9", "9NI71KBMX9", "x1jH7t0Cmy"), language = c("en", 
"en", "en", "en", "en", "en"), registering = c(TRUE, TRUE, FALSE, 
FALSE, FALSE, NA), `_created_at` = structure(c(1485995043.131, 
1488898839.838, 1480461193.146, 1481407887.979, 1489942757.189, 
1491311381.916), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    `_updated_at` = structure(c(1521039527.236, 1488898864.834, 
    1527618624.877, 1481407959.116, 1490043838.561, 1491320333.09
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), lastOnlineTimestamp = c(1521039526.90314, 
    NA, 1480461472, 1481407959, 1490043838, NA), isAgent = c(FALSE, 
    NA, FALSE, FALSE, FALSE, NA), lastAvailableTime = structure(c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), class = c("POSIXct", 
    "POSIXt"), tzone = ""), available = c(NA, NA, NA, NA, NA, 
    NA), busy = c(NA, NA, NA, NA, NA, NA), joinedTeam = structure(c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), class = c("POSIXct", 
    "POSIXt"), tzone = ""), timezone = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    )), row.names = c("list.1", "list.2", "list.3", "list.4", 
"list.5", "list.6"), class = "data.frame")

и

events <- structure(list(`_id` = c("JKY8ZwkM1S", "CG7Xj8dAsA", "pUkFFxoahy", 
"yJVJ34rUCl", "XxXelkIFh7", "GCOsENVSz6"), expirationTime = structure(c(1527261147.873, 
NA, 1527262121.332, NA, 1527263411.619, 1527263411.619), class = c("POSIXct", 
"POSIXt"), tzone = ""), partId = c("d22bfddc-cd51-489f-aec8-5ab9225c0dd5", 
"d22bfddc-cd51-489f-aec8-5ab9225c0dd5", "cf4356da-b63e-4e4d-8e7b-fb63035801d8", 
"cf4356da-b63e-4e4d-8e7b-fb63035801d8", "a720185e-c300-47c0-b30d-64e1f272d482", 
"a720185e-c300-47c0-b30d-64e1f272d482"), type = c("conversation-request", 
"conversation-accepted", "conversation-request", "conversation-accepted", 
"conversation-request", "conversation-request"), `_p_conversation` = c("Conversation$6nSaLeWqs7", 
"Conversation$6nSaLeWqs7", "Conversation$6nSaLeWqs7", "Conversation$6nSaLeWqs7", 
"Conversation$bDuAYSZgen", "Conversation$bDuAYSZgen"), `_p_merchant` = c("Merchant$0A2UYADe5x", 
"Merchant$0A2UYADe5x", "Merchant$0A2UYADe5x", "Merchant$0A2UYADe5x", 
"Merchant$0A2UYADe5x", "Merchant$0A2UYADe5x"), `_p_associate` = c("D9ihQOWrXC", 
"D9ihQOWrXC", "D9ihQOWrXC", "D9ihQOWrXC", "D9ihQOWrXC", "D9ihQOWrXC"
), `_wperm` = list(list(), list(), list(), list(), list(), list()), 
    `_rperm` = list("*", "*", "*", "*", "*", "*"), `_created_at` = structure(c(1527264657.998, 
    1527264662.043, 1527265661.846, 1527265669.435, 1527266922.056, 
    1527266922.059), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    `_updated_at` = structure(c(1527264657.998, 1527264662.043, 
    1527265661.846, 1527265669.435, 1527266922.056, 1527266922.059
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), read = c(TRUE, 
    NA, TRUE, NA, NA, NA), data.customerName = c("Shopper 109339", 
    NA, "Shopper 109339", NA, "Shopper 109364", "Shopper 109364"
    ), data.departmentName = c("Personal advisors", NA, "Personal advisors", 
    NA, "Personal advisors", "Personal advisors"), data.recurring = c(FALSE, 
    NA, TRUE, NA, FALSE, FALSE), data.new = c(TRUE, NA, FALSE, 
    NA, TRUE, TRUE), data.missed = c(0L, NA, 0L, NA, 0L, 0L), 
    data.customerId = c("84uOFRLmLd", "84uOFRLmLd", "84uOFRLmLd", 
    "84uOFRLmLd", "5Dw4iax3Tj", "5Dw4iax3Tj"), data.claimingTime = c(NA, 
    4L, NA, 7L, NA, NA), data.lead = c(NA, NA, FALSE, NA, NA, 
    NA), data.maxMissed = c(NA, NA, NA, NA, NA, NA), data.associateName = c(NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_), data.maxDecline = c(NA, NA, NA, NA, NA, NA
    ), data.goUnavailable = c(NA, NA, NA, NA, NA, NA)), row.names = c("list.1", 
"list.2", "list.3", "list.4", "list.5", "list.6"), class = "data.frame")

Обновление: 21 сентября 2018 года

Это решение теперь приводит к NA только для данныхменя производят в конце функции.Когда я пишу в .csv, это то, что я получаю (естественно, Excel отображает NA -значения в виде пустых значений):

enter image description here

Мои данныеИсточник не изменился, как и мой сценарий.

Что может быть причиной этого?

Я предполагаю, что это непредвиденный случай, когда могло быть 0 попаданий для каждого шага.произошло;Таким образом, есть ли способ добавить 0 к тем случаям, когда не было никаких попаданий, вместо NA / пустых значений?

Есть ли способ избежать этого?

1 Ответ

0 голосов
/ 06 июня 2018

Новое решение на основе предоставленных данных.

Примечание. Поскольку ваши данные не перекрывались в _id, я изменил значение events$_id на такое же, как в users.

Упрощенный пример данных:

users <- structure(list(`_id` = structure(c(4L, 3L, 1L, 5L, 2L, 6L), 
                                                     .Label = c("6XFtOJh0bD", "9NI71KBMX9", "iGIeCEXyVE", 
                                                                           "JTuXhdI4Ai", "mNN986oQv9", "x1jH7t0Cmy"), 
                                                     class = "factor")), .Names = "_id", 
                   row.names = c(NA, -6L), class = "data.frame")
events <- structure(list(`_id` = c("JKY8ZwkM1S", "CG7Xj8dAsA", "pUkFFxoahy", 
                                   "yJVJ34rUCl", "XxXelkIFh7", "GCOsENVSz6"), 
                         type = c("conversation-request", "conversation-accepted", 
                                  "conversation-request", "conversation-accepted", 
                                  "conversation-request", "conversation-request")), 
                    .Names = c("_id", "type"), class = "data.frame", 
                    row.names = c("list.1", "list.2", "list.3", "list.4", "list.5", "list.6"))
events$`_id` <- users$`_id`

> users
         _id
1 JTuXhdI4Ai
2 iGIeCEXyVE
3 6XFtOJh0bD
4 mNN986oQv9
5 9NI71KBMX9
6 x1jH7t0Cmy

> events
              _id                  type
list.1 JTuXhdI4Ai  conversation-request
list.2 iGIeCEXyVE conversation-accepted
list.3 6XFtOJh0bD  conversation-request
list.4 mNN986oQv9 conversation-accepted
list.5 9NI71KBMX9  conversation-request
list.6 x1jH7t0Cmy  conversation-request

Мы можем использовать тот же подход, который я предлагал ранее, просто немного его улучшить.

Сначала мы перебираем unique(events$type), чтобы сохранить table()каждого типа события для идентификатора в списке:

test <- lapply(unique(events$type), function(x) table(events$`_id`, events$type == x))

Затем мы сохраняем определенный тип в качестве имени соответствующей таблицы в списке:

names(test) <- unique(events$type)

Теперь мы используемпросто for -loop для match() user$_id с rownames таблицы и сохранения информации в новой переменной с именем типа события:

for(i in names(test)){
  users[, i] <- test[[i]][, 2][match(users$`_id`, rownames(test[[i]]))]
}

Результат:

> users
         _id conversation-request conversation-accepted
1 JTuXhdI4Ai                    1                     0
2 iGIeCEXyVE                    0                     1
3 6XFtOJh0bD                    1                     0
4 mNN986oQv9                    0                     1
5 9NI71KBMX9                    1                     0
6 x1jH7t0Cmy                    1                     0

Надеюсь, это поможет!

...