Выполнить сумму, когда несколько требуемых условий находятся в другой таблице? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь найти общее количество пользователей в df1, удовлетворяющих условиям, указанным в df2, но постоянно получаю сообщение об ошибке.

df1 выглядит так:

    id  step1          step2
    1   session_start  NA
    2   session_start  NA
    3   session_start  sign_up
    4   session_start  sign_up
    5   session_start  sign_up
    6   sign_up        session_start

df1 <- Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':  6 obs. of  3 variables:
    $ id   : chr  "1" "2" "3" "4" ...
    $ step1: chr  "session_start" "session_start" "session_start" "session_start" ...
    $ step2: chr  NA NA "sign_up" "sign_up" ..

df2 выглядит следующим образом:

    step1          step2         count
    session_start  sign_up       0
    sign_up        in_screen     0
    in_screen      click_banner  0
    session_stop   session_stop  0

df2 <- structure(c("session_start", "sign_up", "0", "sign_up", 
"in_screen", "0", "in_screen", "click_banner", "0", "session_stop", 
"session_stop", "0", .Dim = c(3L, 4L), .Dimnames = list(c("step1", "step2", 
"count"), NULL))

В столбце df2$count я хотел бы показать, сколько (сумма) пользователей выполнили df2$step1 и df2$step2 в этом порядке.В приведенном выше примере кода первая строка в df2$count будет выводить 3 , поскольку 3 пользователей в df1 завершили session_start как df1$step1 и sign_up как df1step2.

Предыдущие попытки

Когда я пытаюсь сделать это вручную с помощью этого кода, все работает нормально:

count <- sum(df1$step1 == "session_start" & df1$step2 == "sign_up", na.rm = TRUE)

Однако, когда я заменяю "session_start" и "sign_up"с динамическими значениями я получаю сообщение об ошибке «Ошибка в test8 $ step1: $ Оператор недопустим для атомарных векторов»:

df2$count <- sum(df1$step1 == df2$step1 & df1$step2 == df2$step2, na.rm = TRUE)

Я пытался заменить «$» на «[]», но все равно получаю »Ошибка: столбцы session_start, sign_up, in_screen, click_banner, session_stop не найдены ":

df2[count] <- sum(df1[step1] == df2[step1] & df1[step2] == df2[step2], na.rm = TRUE)

Идеальный ответ:

Я бы хотел бытьвозможность добавить дополнительный столбец к данным, как показано ниже.Вы можете помочь?Большое спасибо заранее, если так!

    step1          step2         count
    session_start  sign_up       3
    sign_up        in_screen     0
    in_screen      click_banner  0
    session_stop   session_stop  0

Ответы [ 2 ]

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

Вот решение tidyverse.

library(tidyverse)

df2 %>%
  group_by(step1, step2) %>%
  mutate(count = sum(step1 == df1$step1 & step2 == df1$step2, na.rm = TRUE))
## A tibble: 4 x 3
## Groups:   step1, step2 [4]
#  step1         step2        count
#  <chr>         <chr>        <int>
#1 session_start sign_up          3
#2 sign_up       in_screen        0
#3 in_screen     click_banner     0
#4 session_stop  session_stop     0

Обратите внимание, что вместо mutate вы также можете использовать summarise, но порядок выходных строк будет другим.

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

Вы можете использовать mapply и рассчитать количество step1 и step2 значений, заполненных в df1.

df2$count <- mapply(function(x, y) 
    sum(df1$step1 == x & df1$step2 == y, na.rm = TRUE), df2$step1, df2$step2)


df2
#          step1        step2 count
#1 session_start      sign_up     3
#2       sign_up    in_screen     0
#3     in_screen click_banner     0
#4  session_stop session_stop     0

data

df1 <- structure(list(id = c("1", "2", "3", "4", "5", "6"), 
step1 = c("session_start", "session_start", "session_start", 
 "session_start", "session_start", 
 "sign_up"), step2 = c(NA, NA, "sign_up", "sign_up", "sign_up", 
"session_start")), .Names = c("id", "step1", "step2"), row.names = c(NA, 
-6L), class = "data.frame")

df2 <- structure(list(step1 = c("session_start", "sign_up", "in_screen", 
"session_stop"), step2 = c("sign_up", "in_screen", "click_banner", 
"session_stop")), .Names = c("step1", "step2"), row.names = c(NA, 
-4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...