Несколько режимов по переменным - PullRequest
0 голосов
/ 01 октября 2018

Не могу найти ответ на мою проблему.

Вот пример данных

Credit Card Type  Bank   Year   Total Balance
MASTER CARD       BOFA   2017   $100
MASTER CARD       BOFA   2017   $100
MASTER CARD       BOFA   2017   $700
VISA              Wells  2018   $60 
VISA              Wells  2018   $50
VISA              Wells  2018   $60

и т. Д.

Я пытаюсь выяснить, как получить режим с помощью общего баланса по всем переменным, так что все закончится вот так

Желаемый выход:

Credit Card Type  Bank   Year   Mode
MASTER CARD       BOFA   2017   $100
VISA              Wells  2018   $60

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Я нашел решение, используя data.table и скромные пакеты.

library(data.table)
library(modeest)
dt <- data.table("Type"=c(rep("MASTERCARD",3),rep("VISA",3)),"Bank"=c(rep("BOFA",3),rep("Wells",3)),"Year"=c(rep(2017,3),rep(2018,3)),"TotalBalance"=c(100,100,700,60,50,60))
dt[,mfv(TotalBalance)[1],by=c("Type","Bank","Year")]

          Type  Bank Year  V1
 1: MASTERCARD  BOFA 2017 100
 2:       VISA Wells 2018  60
0 голосов
/ 01 октября 2018

Из этого вопроса получение 3 наиболее распространенных элементов групп, объединение связей и игнорирование менее распространенных значений

library(plyr)
getmode<- function(origtable,groupby,columnname) {
  data <- ddply (origtable, groupby, .fun = function(xx){
    c(m1 = paste(names(sort(table(xx[,columnname]),decreasing=TRUE)[1]))
    ) } ) 
  return(data)
}

getmode(df,c("CreditCardType","Bank","Year"),"TotalBalance")

df<-read.table(text="CreditCardType  Bank   Year   TotalBalance
MASTERCARD       BOFA   2017   $100
MASTERCARD       BOFA   2017   $100
MASTERCARD       BOFA   2017   $700
VISA              Wells  2018   $60 
VISA              Wells  2018   $50
VISA              Wells  2018   $60", header=T, stringsAsFactors=F)
0 голосов
/ 01 октября 2018

Другое решение dplyr:

df %>%
  add_count(Credit_Card_Type, Bank, Year, Total_Balance) %>%
  filter(n == max(n)) %>%
  distinct() %>%
  select(-n)

С учетом связи и выбора первого значения режима:

df %>%
  add_count(Credit_Card_Type, Bank, Year, Total_Balance) %>%
  filter(n == max(n)) %>%
  distinct() %>%
  select(-n) %>%
  group_by(Credit_Card_Type, Bank, Year) %>%
  summarise(Total_Balance = first(Total_Balance))

Данные:

df <- read.table(text = "Credit_Card_Type Bank Year Total_Balance
           MASTER_CARD BOFA 2017 100
           MASTER_CARD BOFA 2017 100
           MASTER_CARD BOFA 2017 700
           VISA Wells 2018 60
           VISA Wells 2018 50
           VISA Wells 2018 60", header = TRUE)
0 голосов
/ 01 октября 2018

Используя Mode из stackoverflow.com / q / 2547402 , как предложил Фрэнк, это легко сделать с dplyr.

library(dplyr)

df %>% 
    group_by(CreditCardType, Bank, Year) %>%
    summarise(mode = Mode(TotalBalance))

Где df:

df <- read.table(text = 'CreditCardType  Bank   Year   TotalBalance
MASTERCARD       BOFA   2017   $100
MASTERCARD       BOFA   2017   $100
MASTERCARD       BOFA   2017   $700
VISA              Wells  2018   $60 
VISA              Wells  2018   $50
VISA              Wells  2018   $60', header = T, stringsAsFactors = F)
...