Группировка данных на основе повторяющихся записей с использованием R - PullRequest
0 голосов
/ 11 июля 2019

У меня есть набор данных, который содержит повторяющиеся записи / общие записи. Это выглядит примерно так:

| Vendor | Buyer | Amount |
|--------|:-----:|-------:|
| A      |   P   |    100 |
| B      |   P   |    150 |
| C      |   Q   |    300 |
| A      | P     | 290    |

Мне нужно сгруппировать похожие записи вместе, но я не хочу суммировать мою сумму. Я хочу, чтобы сумма была представлена ​​индивидуально. Вывод должен выглядеть примерно так:

| Vendor | Buyer | Amount |
|--------|:-----:|-------:|
| A      |   P   |    100 |
| A      |   P   |    290 |
|        |       |        |
| B      | P     | 150    |
|        |       |        |
| C      | Q     | 300    |

Я думал об использовании split (), но поскольку в моих исходных данных слишком много записей, функция split создает слишком много списков, и создание из них новых наборов данных становится утомительным. Как я могу достичь вышеуказанного результата любым другим способом?

EDIT: Давайте предположим, что у нас есть дополнительный столбец с именем date, и набор данных теперь выглядит так:

| Vendor | Buyer | Amount | Date      |
|--------|:-----:|-------:|-----------|
| A      |   P   |    100 | 3/6/2019  |
| B      |   P   |    150 | 7/6/2018  |
| C      |   Q   |    300 | 4/21/2018 |
| A      | P     | 290    | 6/5/2018  |

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

| Vendor | Buyer | Amount | Date      |
|--------|:-----:|-------:|-----------|
| A      |   P   |    290 | 6/5/2018  |
| A      |   P   |    100 | 3/6/2019  |
|        |       |        |           |
| B      | P     | 150    | 7/6/2018  |
|        |       |        |           |
| C      | Q     | 300    | 4/21/2018 | 

и затем удалите отдельные транзакции, чтобы получить финальную таблицу, содержащую только

| Vendor | Buyer | Amount | Date     |
|--------|:-----:|-------:|----------|
| A      |   P   |    290 | 6/5/2018 |
| A      | P     | 100    | 3/6/2019 |

1 Ответ

0 голосов
/ 11 июля 2019

Далее мы сортируем фрейм данных и добавляем столбец группы, который позволяет легко обрабатывать отдельные группы.Например, для обработки групп без создания большого разделения DF:

for(g in unique(DFout$group)) {
  DFsub <- subset(DFout, group == g)
  ... process DFsub ...
}

1) База R Сортировка данных и затем присвоение столбцу группы с помощью cumsum внедублированные элементы.

library(data.table)

o <- with(DF, order(Vendor, Buyer))
DFo <- DF[o, ]
DFout <- transform(DFo, group = cumsum(!duplicated(data.frame(Vendor, Buyer))))
DFout

, что дает:

  Vendor Buyer Amount group
1      A     P    100     1
4      A     P    290     1
2      B     P    150     2
3      C     Q    300     3

Я не уверен, что это хорошая идея, но если вы действительно хотите добавитьстрока NA после каждой группы:

ix <- unname(unlist(tapply(DFout$group, DFout$group, function(x) c(x, NA))))
ix[!is.na(ix)] <- seq_len(nrow(DFout))
DFout[ix, ]

2) data.table Преобразовать в data.table, установить ключ (который сортирует его) и использовать rleid для назначения группычисло.

library(data.table)

DT <- data.table(DF)
setkey(DT, Vendor, Buyer)
DT[, group := rleid(Vendor, Buyer)]

3) sqldf Другой подход заключается в использовании SQL.Это требует разработки версии RSQLite на github .Здесь dense_rank действует аналогично rleid выше.

library(sqldf)

sqldf("select *, dense_rank() over (order by Vendor, Buyer) as [group]
  from DF
  order by Vendor, Buyer")

, давая:

  Vendor Buyer Amount group
1      A     P    100     1
2      A     P    290     1
3      B     P    150     2
4      C     Q    300     3

Примечание

DF <- structure(list(Vendor = structure(c(1L, 2L, 3L, 1L), .Label = c("A", 
"B", "C"), class = "factor"), Buyer = structure(c(1L, 1L, 2L, 
1L), .Label = c("P", "Q"), class = "factor"), Amount = c(100L, 
150L, 300L, 290L)), class = "data.frame", row.names = c(NA, -4L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...