Есть ли функция для объединения нескольких строк с совпадающими значениями в одну строку? - PullRequest
1 голос
/ 15 января 2020

Привет, у меня проблема с поиском решения для этой конкретной ситуации ниже. У меня есть такой набор данных, набор данных, показывающий публичные c данные транспорта. BSTN и ASTN - это ID транспортных станций c.

#   card_id transaction  BSTN   ASTN  transfer  Ttime
#     1          1         a     b      0         1
#     1          1         b     c      1         2
#     2          3         e     f      0         3
#     2          3         g     h      1         4
#     2          3         i     j      2         5
#     3          1         k     l      0         1 
#     4          1         m     n      0         2
#     4          2         o     p      0         3

, поэтому я знаю, что для card_id # 1 человек путешествовал от a до c и я хотел бы объединить эти строки, чтобы таблица данных выглядела следующим образом.

#   card_id transaction  BSTN   ASTN  transfer  Ttime
#     1          1         a     c      1         3
#     2          3         e     j      2         12
#     3          1         k     l      0         1 
#     4          1         m     n      0         2
#     4          2         o     p      0         3

Проблема в в том, что для card_id # 2 третья и четвертая строки BSTN и ASTN не совпадает (f и g), что отличается от card_id # 1, но независимо от того, я бы хотел объединить эти строки, если значения в столбце «транзакция» совпадают.

было бы правильное код

1 Ответ

3 голосов
/ 15 января 2020

Возможно, вы получите то, что вам нужно, используя dplyr. Это может потребовать дополнительной настройки в зависимости от нюансов с остальными данными.

data

df <- read.table(textConnection("card_id transaction  BSTN   ASTN  transfer  Ttime
1          1         a     b      0         1
1          1         b     c      1         2
2          3         e     f      0         3
2          3         g     h      1         4
2          3         i     j      2         5
3          1         k     l      0         1 
4          1         m     n      0         2
4          2         o     p      0         3"), header = TRUE, as.is = TRUE)

решение

Используйте group_by, чтобы определить блоки, над которыми вы хотите summarize() включить. Тогда вопрос заключается в том, как вы хотите определить резюме.

library(dplyr)

df %>% 
  group_by(card_id, transaction) %>% 
  summarize(BSTN = BSTN[which.min(transfer)],
            ASTN = ASTN[which.max(transfer)],
            transfer = max(transfer),
            Ttime = sum(Ttime))

#  A tibble: 5 x 6
#  Groups:   card_id [4]
#   card_id transaction BSTN  ASTN  transfer Ttime
#     <int>       <int> <chr> <chr>    <int> <int>
# 1       1           1 a     c            1     3
# 2       2           3 e     j            2    12
# 3       3           1 k     l            0     1
# 4       4           1 m     n            0     2
# 5       4           2 o     p            0     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...