R Присоединиться к столу при ближайшем посещении - PullRequest
0 голосов
/ 01 апреля 2020

Привет, у меня есть таблица, которая выглядит следующим образом:

Customer|Cluster|Segment|Visit|Earliest Visit|
    A   |  D    |  A    | 2018|  2018        |
    A   |  D    |  B    | 2019|  2018        |
    B   |  D    |  C    | 2017|  2017        |
    B   |  D    |  D    | 2018|  2017        |

В R, Как я могу изменить столбец «Самое раннее посещение», чтобы показывать только первое посещение в столбце, а остальные - «NA» для каждого клиента ? Результат должен выглядеть так:

Customer|Cluster|Segment|Visit|Earliest Visit|
    A   |  D    |  A    | 2018|  2018        |
    A   |  D    |  B    | 2019|  NA          |
    B   |  D    |  C    | 2017|  2017        |
    B   |  D    |  D    | 2018|  NA          |

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Самый быстрый способ сделать это - использовать мощный пакет data.table .

library(data.table)

dt = data.table( Customer = c("A", "A", "B", "B"),
                 Cluster = rep("D", 4),
                 Segment = c("A", "B", "C", "D"),
                 Visit = c( 2018, 2019, 2017, 2018),
                 Earliest_Visit = c( 2018, 2018, 2017, 2017) 
                 )
dt[ , dup := duplicated( dt, by = "Earliest_Visit" ) ]
dt[ (dup), Earliest_Visit := NA_integer_ ]
dt[ , dup := NULL ]

> dt
   Customer Cluster Segment Visit Earliest_Visit
1:        A       D       A  2018           2018
2:        A       D       B  2019             NA
3:        B       D       C  2017           2017
4:        B       D       D  2018             NA
1 голос
/ 01 апреля 2020

Вы можете сделать это в base, как показано ниже:

df[duplicated(df$Customer), 'Earliest Visit'] <- NA

Или с replace:

transform(df, `Earliest Visit` = replace(`Earliest Visit`, duplicated(Customer), NA))

То же самое с dplyr:

library(dplyr)

df %>%
  mutate(`Earliest Visit` = replace(`Earliest Visit`, duplicated(Customer), NA))

Или также:

library(dplyr)

df %>%
  group_by(Customer) %>%
  mutate(`Earliest Visit` = replace(`Earliest Visit`, row_number() > 1, NA)) %>% ungroup

Вывод:

  Customer Cluster Segment Visit Earliest Visit
1        A       D       A  2018           2018
2        A       D       B  2019             NA
3        B       D       C  2017           2017
4        B       D       D  2018             NA
1 голос
/ 01 апреля 2020

Поскольку вы упомянули присоединение, вы можете использовать пакет sqldf здесь:

library(sqldf)
sql <- "SELECT Customer, Cluster, Segment, Visit,
            CASE WHEN rn = 1 THEN Visit END AS \"Earliest Visit\"
        FROM
        (
            SELECT *, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Visit) rn
            FROM your_df
        ) t"

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