Сортировка данных в R по нескольким параметрам - PullRequest
0 голосов
/ 06 декабря 2018

У меня следующая проблема: у меня есть набор данных, включающий 3 разных столбца (их больше, но для анализа они не актуальны).Вот пример набора данных (исходный набор данных имеет гораздо больше наблюдений):

Date               Company             Return
March              A                   0.03
March              A                   0.02
March              B                   0.01
April              B                   0.02       
April              A                   0.01
May                C                   0.02
June               B                   0.03

Теперь я хочу найти наибольшую прибыль за каждый месяц, но каждая компания должна показывать максимум 3 раза в конечном результате.Я попробовал некоторые циклы for для создания подмножеств для каждого месяца, но потом я понятия не имею, как мне извлечь наибольшую прибыль за каждый месяц, при этом ограничение для каждой компании отображается менее 3 раз.Важно то, что, когда компания возвращалась трижды в выходе, необходимо выбрать компанию со следующим наивысшим доходом за определенный месяц.Каждый месяц должен быть возвращен один раз.

Ответы [ 3 ]

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

Сначала давайте создадим набор данных с более чем 3 случаями любой компании, просто чтобы мы могли проверить его:

df1<-structure(list(Date = c("March", "March", "March", "April", "April", 
     "May", "June", "July"), Company = c("A", "A", "B", "B", "A", 
     "C", "B", "B"), Return = c(0.03, 0.02, 0.01, 0.02, 0.01, 0.02, 
     0.03, 0.02)), .Names = c("Date", "Company", "Return"), row.names = c(NA, 
     -8L), class = "data.frame")

Теперь, используя dplyr:

df1 %>% group_by(Company) %>% 
  arrange(desc(Return)) %>% 
  filter(row_number() %in% 1:3) %>% 
  group_by(Date) %>% 
  filter(Return==max(Return))

Во-первых, мы сохраняем только три лучших результата для каждой компании, таким образом гарантируя, что, несмотря ни на что, в нашем конечном результате не будет более трех экземпляров для каждой компании.Затем мы группируем по дате и просто сохраняем верхнюю прибыль за каждый месяц.

# A tibble: 5 x 3
# Groups:   Date [5]
  Date  Company Return
  <chr> <chr>    <dbl>
1 March A         0.03
2 June  B         0.03
3 April B         0.02
4 May   C         0.02
5 July  B         0.02
0 голосов
/ 09 декабря 2018

Если вы хотите максимизировать общий доход, то вам нужно перейти к подходу оптимизации с формулировкой:

  • Целевая функция для максимизации: сумма возвращений
  • Ежемесячное ограничение: каждый месяц должен появляться один раз в решении
  • Ограничение компании: каждая компания может появляться максимум 3 раза в решении

Это можно сделать с помощью библиотеки lpSolveAPI:

library(lpSolveAPI)

# Create data.table
dt <- data.frame(Date = c("March", "March", "March", "April", "April", "May", "June"),
                 Company = c("A", "A", "B", "B", "A", "C", "B"),
                 Return = c(0.03, 0.02, 0.01, 0.02, 0.01, 0.02, 0.03))

# Objective
obj <- -dt$Return

# Constraints
constraints <- list()

# Each month must appear once in the solution
for (month in unique(dt$Date)){
  constraints[[paste0('month', month)]] <- list(xt = as.numeric(dt$Date == month),
                                                type = "=",
                                                rhs = 1)
}

# Each company can appear maximum 3 times in the solution
for (com in unique(dt$Company)){
  constraints[[paste0('company', com)]] <- list(xt = as.numeric(dt$Company == com),
                                                type = "<=",
                                                rhs = 3)
}

# Build model
lprec <- make.lp(0, ncol = nrow(dt))
set.type(lprec, columns = seq(1,nrow(dt)), type = "binary")

set.objfn(lprec, obj = obj)

for (constraint in constraints){
  add.constraint(lprec, xt = constraint$xt, type = constraint$type, rhs = constraint$rhs)
}

# Compute Solution
solve(lprec)

# Visualize solution
solution <- dt[get.variables(lprec)==1,]

solution

#    Date Company Return
# 1 March       A   0.03
# 4 April       B   0.02
# 6   May       C   0.02
# 7  June       B   0.03
0 голосов
/ 06 декабря 2018

как это?

> library(tidyverse)
> 
> dataset<-data.frame(Date=c("March","March","March","April","April","May","June"),Company=c("A","A","B","B","A","C","B"),Return=c(0.03,0.02,0.01,0.02,0.01,0.02,0.03))

> dataset %>% group_by(Date,Company) %>% summarise(max_ret=max(Return))
# A tibble: 6 x 3
# Groups:   Date [?]
Date  Company max_ret
<fct> <fct>     <dbl>
1 April A          0.01
2 April B          0.02
3 June  B          0.03
4 March A          0.03
5 March B          0.01
6 May   C          0.02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...