2015-08-17 4 views
2

У меня есть data.frame, который выглядит следующим образом:Объединить строки вместе по условию в R

IsLead ID Path LogTime     PathCode Conversion 
0   198822  2015-06-19 01:57:11.000 J   ConvA 
0   198822  2015-06-19 01:58:33.000 F   ConvA 
1   198822  2015-06-19 02:07:01.000 H   ConvA 
0   253547  2015-06-20 07:52:33.000 A   ConvD 
1   253547  2015-06-20 07:52:33.000 H   ConvD 
2   351754  2015-06-20 07:52:33.000 J   
2   351754  2015-06-20 07:52:33.000 A   

Где IsLead указывает, если строка будет конвертировать, где 0 является взаимодействие на пути, и где 1 - фактическая точка преобразования. 2 указывает, что путь не будет преобразован.

ID Path указывает уникальный путь. поэтому каждый путь с 0 должен содержать 1. и каждый путь с a 2 содержит только 2.

LogTime указывает время взаимодействия.

PathCode указывает тип взаимодействия. где H указывает на взаимодействие, в котором происходит преобразование, поэтому IsLead 1 всегда является PathCode H и указывает, что ID Path сделан.

Конверсия указывает, в какой точке конверсии произошло преобразование.

rowsare отсортирован, чтобы гарантировать, что вы будете следовать каждый путь ID трактов и они не переплетаясь через Афоризм

Я хотел бы изменить свою data.frame так это выглядит следующим образом:

ID Path Lead Path Conversion 
198822  1  JFH  ConvA 
253547  1  AH  ConvD 
351754  0  JA  

Так произошло то, что для каждого пути идентификации PathCode был объединен в правильном порядке. И для каждого пути с преобразованием значение LEAD равно 1 и 0, если конверсия отсутствует.

Если возможно, я предпочел бы, чтобы столбец «Путь» отображался БЕЗ «Н», поэтому в этом случае путь будет: «JF», «A», «JA».

ответ

3

Вот возможный data.table решение (я предполагаю, что данные уже отсортированы, из нет, вы можете добавить order(LogTime) к i го выражения)

library(data.table) 
setDT(df)[, .(Lead = +all(Conversion != ''), 
       Path = gsub('H', "", paste(PathCode, collapse = ""), fixed = TRUE)), 
      by = .(ID.Path, Conversion)] 

# ID.Path Conversion Lead Path 
# 1: 198822  ConvA 1 JF 
# 2: 253547  ConvD 1 A 
# 3: 351754    0 JA 

или сходным с dplyr

library(dplyr) 
df %>% 
    group_by(ID.Path, Conversion) %>% 
    summarise(Lead = +all(Conversion != ''), 
      Path = paste(PathCode, collapse = "")) %>% 
    mutate(Path = gsub('H', "", Path, fixed = TRUE)) 

# Source: local data frame [3 x 4] 
# Groups: ID.Path 
# 
# ID.Path Conversion Lead Path 
# 1 198822  ConvA 1 JF 
# 2 253547  ConvD 1 A 
# 3 351754    0 JA 
+0

Спасибо за ваш ответ, он работал как шарм! Я заметил, что на самом деле я предпочел бы, чтобы буквы были на пути в обратном порядке. Это означает, что вместо JF в первой строке это должно быть FJ. Знаете ли вы о функции, которая меняет порядок букв? Или можно было бы просто изменить порядок кадра данных с самого начала? – KhalidN

+1

Да, просто замените 'paste (PathCode, collapse =" ")' с 'paste (rev (PathCode), collapse =" ")' в обоих решениях. Или вы можете заказать свои данные в порядке отмены. –

2

Вы можете использовать sqldf библиотеку, которая поставляется с полезной функцией group_concat (доступно в MySQL):

> require(sqldf) 
> df_new <- sqldf("select IDPath, case when Conversion = '' then 0 else 1 end as Lead, 
         Conversion, group_concat(PathCode) PathCode 
        from df 
        group by IDPath", method = "raw") 
> df_new$PathCode <- gsub("H|,", "", df_new$PathCode) 
> df_new 
    IDPath Lead Conversion PathCode 
1 198822 1  ConvA  JF 
2 253547 1  ConvD  A 
3 351754 0     JA 

Приведенный выше код принимает исходный кадр данных называется df. Обратите внимание, что мне пришлось вручную удалить запятые из столбца PathCode, потому что я не мог найти способ получить ключевое слово SEPARATOR для работы вместе с R-версией функции group_concat.

+0

Возможно, также удалить «H» в соответствии с желаемым результатом. –

+0

Да, но только он хочет удалить терминал «H» или любой «H», который может появиться? –

+0

Любой 'H' в соответствии с их желаемым результатом *, поэтому в этом случае путь будет следующим:« JF »,« A »,« JA ». *« –

Смежные вопросы