মোডটি সন্ধানের জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে?


391

আর এ, mean()এবং median()এমন স্ট্যান্ডার্ড ফাংশন যা আপনি যা প্রত্যাশা করতেন তা করে। mode()আপনাকে অবজেক্টের অভ্যন্তরীণ স্টোরেজ মোড জানায়, মানটি তার তর্কে সবচেয়ে বেশি ঘটে না। তবে কি কোনও মানক গ্রন্থাগার ফাংশন রয়েছে যা ভেক্টরের (বা তালিকা) জন্য পরিসংখ্যান মোড প্রয়োগ করে?


4
আপনার ডেটা পূর্ণসংখ্যার, সংখ্যাসূচক, ফ্যাক্টর ... কিনা তা আপনাকে পরিষ্কার করা দরকার? সংখ্যার জন্য মোডের অনুমান আলাদা হবে এবং অন্তরগুলি ব্যবহার করবে। পরিমিত
স্মি

2
মোডের জন্য আর কেন অন্তর্নির্মিত ফাংশন নেই? কেন modeফাংশন হিসাবে একই হিসাবে বিবেচনা করে class?
কোরি লেভিনসন

উত্তর:


400

আরও একটি সমাধান, যা উভয় সংখ্যাসূচক এবং চরিত্র / ফ্যাক্টর ডেটার জন্য কাজ করে:

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

আমার অদ্ভুত ছোট্ট মেশিনে, এটি প্রায় অর্ধ সেকেন্ডের মধ্যে 10 এম-ইন্টিজার ভেক্টরের মোড তৈরি করতে এবং সন্ধান করতে পারে।

যদি আপনার ডেটা সেটে একাধিক মোড থাকতে পারে তবে উপরের সমাধানটি একই পদ্ধতির মতো নেয় which.maxএবং মোডের সেটটির প্রথম-উপস্থিতিমানের মান দেয়। সমস্ত মোড ফিরিয়ে দিতে , এই রূপটি ব্যবহার করুন (মন্তব্যগুলিতে @ ডিজাইম সব থেকে):

Modes <- function(x) {
  ux <- unique(x)
  tab <- tabulate(match(x, ux))
  ux[tab == max(tab)]
}

7
লজিকাল জন্য কাজ করে! সমস্ত ধরণের ভেক্টরগুলির জন্য ডেটা প্রকার সংরক্ষণ করে (অন্যান্য উত্তরে কিছু বাস্তবায়ন থেকে ভিন্ন)।
ডেভিডসি

39
এটি মাল্টি-মডেল ডেটাসেটের ক্ষেত্রে সমস্ত মোড ফেরত দেয় না (উদাঃ c(1,1,2,2))। আপনার সাথে আপনার শেষ লাইনটি পরিবর্তন করা উচিত:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
digEmAll

6
@ এরিয়াবাদত এই জন্য, আপনি ux[which.max(tabulate(match(x, ux)))]ঠিক সঙ্গে প্রতিস্থাপন করতে হবে max(tabulate(match(x, ux)))
কেন উইলিয়ামস

4
আপনি নোট করেছেন যে Mode(1:3)দেয় 1এবং Mode(3:1)দেয় 3তাই মোড সর্বাধিক ঘন উপাদান বা প্রথমটি যদি তাদের সমস্তটি স্বতন্ত্র হয় তবে ফিরে আসে।
এনরিক পেরেজ হেরেরো

2
যেমন এনরিক বলেছেন: মোড না থাকলে এটি ব্যর্থ হয় এবং পরিবর্তে আপনাকে এমন ধারণা দেয় যে প্রথম মানটি হল মোড। যদি এটি ফিরে আসে 0বা NAএই ক্ষেত্রেগুলিতে আরও ভাল হত ।
not2qubit

66

এমন প্যাকেজ রয়েছে modeestযা ইউনিভারিটিভ ইউনিমোডাল (এবং কখনও কখনও মাল্টিমোডাল) ডেটা এবং সাধারণ সম্ভাবনা বিতরণের মোডগুলির মানগুলির মূল্য নির্ধারণ করে।

mySamples <- c(19, 4, 5, 7, 29, 19, 29, 13, 25, 19)

library(modeest)
mlv(mySamples, method = "mfv")

Mode (most likely value): 19 
Bickel's modal skewness: -0.1 
Call: mlv.default(x = mySamples, method = "mfv")

আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন


7
সুতরাং শুধু মোড মান পেতে mfv(mySamples)[1]1গুরুত্বপূর্ণ হচ্ছে এটা আসলে ফেরৎ অধিকাংশ ঘন মান গুলি
পরমাণুগুলি

এটি এই উদাহরণে কাজ করছে বলে মনে হচ্ছে না: পাঠাগার (মাঝারি) a <- rnorm (50, 30, 2) বি <- rnorm (100, 35, 2) সি <- rnorm (20, 37, 2) তাপমাত্রা-সি <- সি (এ, বি, সি) হিস্ট (টেম্পারেচার-সি) # ম্যান অ্যাবলেট (ভি = গড় (তাপমাত্রা -১), কল = "লাল", এলডাব্লুড = 2) # মিডিয়ায় অবলাইন (ভি = মিডিয়ান (টেম্পারেচার-সি), কল = "কালো", lwd = 2) # মোড আবলাইন (v = mlv (তাপমাত্রা -C, পদ্ধতি = "এমএফভি") [1], কল = "কমলা", lwd = 2)
আগুসে কামাচো

1
@ অ্যাটমিক্যালস: [1] এর সাথে আপনি কেবল প্রথম মোড পাবেন। বিমোডাল বা সাধারণ এন- mfv(mySamples)
মডেল

1
আর সংস্করণ ৩.6.০ এর জন্য, এটি বলছে যে ফাংশন 'এমএলভি "ফাংশনটি খুঁজে পেল না এবং যখন এমএফভি (মাইসমোলস) চেষ্টা করলাম তখন একই ত্রুটি। এটি অবচয় হয়?
ডাঃ নিশা অরোরা

@ শ্রনিশাআরোরা: আপনি 'মোডেস্ট' প্যাকেজটি ডাউনলোড করেছেন?
পেটজী

59

এটি আর মেলিং তালিকায় পাওয়া গেছে, আশা করি এটি সহায়ক। আমি যাইহোক যা ভাবছিলাম তাও এটি। আপনি ডেটা টেবিল করতে () করতে চাইবেন, বাছাই করুন এবং তারপরে প্রথম নামটি চয়ন করুন। এটা হ্যাকিশ কিন্তু কাজ করা উচিত।

names(sort(-table(x)))[1]

6
এটি পাশাপাশি একটি চালাক কাজ work এর কয়েকটি ত্রুটি রয়েছে: সারণি অ্যালগরিদম সর্বাধিক () ভিত্তিক পদ্ধতির চেয়ে বড় স্থান এবং সময় সাশ্রয়ী হতে পারে (=> আরও বড় নমুনার তালিকার জন্য এড়ানো যায়)। এছাড়াও আউটপুটটি মোডে রয়েছে (পাং / অস্পষ্টতাকে ক্ষমা করুন) "অক্ষর" নয় "সংখ্যাসূচক"। এবং অবশ্যই, মাল্টি-মডেল বিতরণের জন্য পরীক্ষা করার প্রয়োজনটিকে নতুনভাবে ক্রাচিং এড়াতে বাছাই করা টেবিলটি সংরক্ষণের প্রয়োজন হবে।
এমজেভি

2
আমি চলমান সময়কে 1e6 উপাদানগুলির একটি ফ্যাক্টর দিয়ে পরিমাপ করেছি এবং এই সমাধানটি প্রায় 3 ফ্যাক্টর দ্বারা গৃহীত উত্তরের চেয়ে দ্রুত ছিল!
ভনজড

আমি মাত্র asunumeric () ব্যবহার করে এটি সংখ্যায় রূপান্তর করেছি। পুরোপুরি সূক্ষ্ম কাজ করে। ধন্যবাদ!
অভিষেক সিং

46

আমি উপরের উইলিয়ামস পোস্টটি দুর্দান্ত দেখতে পেয়েছি, আমি এনএ মানগুলির জন্য অ্যাকাউন্টে কয়েকটি লাইন যুক্ত করেছি এবং এটিকে স্বাচ্ছন্দ্যের জন্য একটি ফাংশন করে তুলেছি।

Mode <- function(x, na.rm = FALSE) {
  if(na.rm){
    x = x[!is.na(x)]
  }

  ux <- unique(x)
  return(ux[which.max(tabulate(match(x, ux)))])
}

আমি এটির জন্য বেশ কয়েকটি গতি পেয়েছি, নীচের উত্তরটি দেখুন।
ড্যান হাউটন

33

ক্রমাগত অবিচ্ছিন্ন বিতরণ (যেমন একটি সাধারণ বিতরণ) থেকে আসা সংখ্যার ভেক্টরের মোডটি নির্ধারণের দ্রুত এবং নোংরা উপায়টি নীচের ফাংশনটি সংজ্ঞায়িত ও ব্যবহার করছে:

estimate_mode <- function(x) {
  d <- density(x)
  d$x[which.max(d$y)]
}

তারপরে মোডের প্রাক্কলনটি পেতে:

x <- c(5.8, 5.6, 6.2, 4.1, 4.9, 2.4, 3.9, 1.8, 5.7, 3.2)
estimate_mode(x)
## 5.439788

3
এটির জন্য কেবল একটি নোট: আপনি এভাবে যে কোনও গ্রুপের ক্রমাগত সংখ্যার একটি "মোড" পেতে পারেন। কাজ করার জন্য কোনও সাধারণ বিতরণ থেকে ডেটা আসতে হবে না। ইউনিফর্ম বিতরণ থেকে সংখ্যা নেওয়ার উদাহরণ এখানে। set.seed(1); a<-runif(100); mode<-density(a)$x[which.max(density(a)$y)]; abline(v=mode)
জোটা 22'14

error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
সার্জিও

@ xhie এই ত্রুটি বার্তাটি আপনাকে জানার প্রয়োজনীয় সমস্ত কিছু আপনাকে জানায়। আপনার যদি মাত্র একটি পয়েন্ট থাকে তবে কল করার সময় আপনাকে ম্যানুয়ালি ব্যান্ডউইথ সেট করতে হবে density। তবে, যদি আপনার কেবল একটি ডেটাপয়েন্ট রয়েছে তবে সেই ডেটাপয়েন্টের মান সম্ভবত যাইহোক মোডের জন্য আপনার সেরা অনুমান হতে পারে ...
রাসমাস বুথ

আপনি ঠিক বলেছেন, তবে আমি কেবল একটি ত্বক যোগ estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } } করেছি : আমি বৃত্তাকার প্যাকেজ সহ ভেক্টরিয়াল গড় ব্যবহার করে দিকের পরিবর্তে মূল দিক বাতাসের অনুমান করার পদ্ধতিটি পরীক্ষা করছি। আমি 'বহুভুজ গ্রেডের উপরে পয়েন্ট নিয়ে কাজ করছি, তাই, কখনও কখনও দিকনির্দেশের সাথে কেবল একটি পয়েন্ট থাকে। ধন্যবাদ!
সেরজিও

@ xhie যুক্তিসঙ্গত মনে হয় :)
রাসমুস বুথ

14

নিম্নলিখিত ফাংশনটি তিনটি আকারে আসে:

পদ্ধতি = "মোড" [ডিফল্ট]: অমনোডাল ভেক্টরের জন্য মোড গণনা করে, অন্যথায় একটি এনএ
পদ্ধতি = "এনমোডস" প্রদান করে: ভেক্টর
পদ্ধতিতে "মোড" এর মোডের সংখ্যা গণনা করে: অবিমোডাল বা পলিমোডালের জন্য সমস্ত মোডের তালিকা করে ভেক্টর

modeav <- function (x, method = "mode", na.rm = FALSE)
{
  x <- unlist(x)
  if (na.rm)
    x <- x[!is.na(x)]
  u <- unique(x)
  n <- length(u)
  #get frequencies of each of the unique values in the vector
  frequencies <- rep(0, n)
  for (i in seq_len(n)) {
    if (is.na(u[i])) {
      frequencies[i] <- sum(is.na(x))
    }
    else {
      frequencies[i] <- sum(x == u[i], na.rm = TRUE)
    }
  }
  #mode if a unimodal vector, else NA
  if (method == "mode" | is.na(method) | method == "")
  {return(ifelse(length(frequencies[frequencies==max(frequencies)])>1,NA,u[which.max(frequencies)]))}
  #number of modes
  if(method == "nmode" | method == "nmodes")
  {return(length(frequencies[frequencies==max(frequencies)]))}
  #list of all modes
  if (method == "modes" | method == "modevalues")
  {return(u[which(frequencies==max(frequencies), arr.ind = FALSE, useNames = FALSE)])}  
  #error trap the method
  warning("Warning: method not recognised.  Valid methods are 'mode' [default], 'nmodes' and 'modes'")
  return()
}

এই ক্রিয়াকলাপের আপনার বিবরণে আপনি "মোড" এবং "এনমোডস" সরিয়ে নিয়েছেন। কোড দেখুন। আসলে, "এনমোডস" মানগুলির ভেক্টর এবং "মোডগুলি" মোডের সংখ্যা প্রদান করে returns এতদূর আমি দেখেছি মোডগুলি সন্ধান করার জন্য আপনার ফাংশনটি খুব ভাল আত্মা।
গ্রজেগোর্জ অ্যাডাম কোওলস্কি

মন্তব্যের জন্য অনেক ধন্যবাদ। "এনমোড" এবং "মোড" এখন প্রত্যাশা অনুযায়ী আচরণ করা উচিত।
ক্রিস

আপনার ফাংশনটি প্রায় কাজ করে, যখন প্রতিটি মান একইভাবে প্রায়শই ব্যবহার হয় method = 'modes'। তারপরে ফাংশনটি সমস্ত অনন্য মান দেয়, তবে আসলে কোনও মোড নেই তাই এটি NAপরিবর্তে ফিরে আসা উচিত । আমি আপনার ফাংশনের একটি সামান্য অনুকূলিত সংস্করণযুক্ত অন্য উত্তর যুক্ত করব, অনুপ্রেরণার জন্য ধন্যবাদ!
হুগভডবার্গ

পলিমোডাল ভেক্টরের ডিফল্ট পদ্ধতিটি ব্যবহার করার সময় কেবল কোনও সময় খালি ননামিক ভেক্টর সাধারণত এই ফাংশনটি দিয়ে একটি এনএ তৈরি করতে পারে। 1,2,3,4 হিসাবে সংখ্যার একটি সাধারণ ক্রমের মোডটি আসলে ক্রমের সমস্ত সংখ্যা numbers উদাহরণস্বরূপ মোদিভ (সি (1,2,3,4), পদ্ধতি = "মোডগুলি") রিটার্ন দেয় [1] 1 2 3 4 এটিকে নির্বিশেষে, আমি এটির যথেষ্ট পরিমাণে সংস্থার কারণ ফাংশনটি অপ্টিমাইজড দেখতে খুব আগ্রহী হব বর্তমান অবস্থা
ক্রিস

এই ফাংশনটির আরও দক্ষ সংস্করণের জন্য, উপরে @ হুগভডবার্গের পোস্টটি দেখুন :)
ক্রিস

10

এখানে, আরও একটি সমাধান:

freq <- tapply(mySamples,mySamples,length)
#or freq <- table(mySamples)
as.numeric(names(freq)[which.max(freq)])

আপনি টেবিলের সাহায্যে প্রথম লাইনটি প্রতিস্থাপন করতে পারেন।
জোনাথন চ্যাং

আমি ভাবছিলাম যে 'ট্যাপ্লি' 'টেবিলের' চেয়ে আরও দক্ষ, তবে তারা উভয় লুপের জন্য ব্যবহার করে। আমি টেবিল সহ সমাধান সমান বলে মনে করি। আমি উত্তর আপডেট।
টিউসার

9

আমি এখনও ভোট দিতে পারি না তবে রাসমাস বাথের উত্তর আমি যা খুঁজছিলাম। যাইহোক, আমি এটিকে কিছুটা সংশোধন করব যাতে উদাহরণস্বরূপ কেবলমাত্র 0 এবং 1 এর মধ্যে বিতরণকে বাধা দেওয়া যায়।

estimate_mode <- function(x,from=min(x), to=max(x)) {
  d <- density(x, from=from, to=to)
  d$x[which.max(d$y)]
}

আমরা জানি যে আপনি আপনার সমস্ত বিতরণে সীমাবদ্ধ রাখতে না চাইতে পারেন, তারপরে = - "বড় সংখ্যা" থেকে = "বড় সংখ্যা" তে সেট করুন


error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
সার্জিও

এক্স ভেক্টর হওয়া উচিত
এলেরুয়েট

8

কেন উইলিয়ামসের উত্তর করার জন্য একটি ছোট পরিবর্তন, ঐচ্ছিক প্যারাম যোগ na.rmএবং return_multiple

উপর নির্ভর নির্ভর উত্তরগুলির বিপরীতে names(), এই উত্তরটি xপ্রত্যাবর্তিত মান (গুলি) -এর উপাত্তের ধরণ বজায় রাখে ।

stat_mode <- function(x, return_multiple = TRUE, na.rm = FALSE) {
  if(na.rm){
    x <- na.omit(x)
  }
  ux <- unique(x)
  freq <- tabulate(match(x, ux))
  mode_loc <- if(return_multiple) which(freq==max(freq)) else which.max(freq)
  return(ux[mode_loc])
}

এটি দেখাতে alচ্ছিক প্যারামগুলির সাথে কাজ করে এবং ডেটা টাইপ বজায় রাখে:

foo <- c(2L, 2L, 3L, 4L, 4L, 5L, NA, NA)
bar <- c('mouse','mouse','dog','cat','cat','bird',NA,NA)

str(stat_mode(foo)) # int [1:3] 2 4 NA
str(stat_mode(bar)) # chr [1:3] "mouse" "cat" NA
str(stat_mode(bar, na.rm=T)) # chr [1:2] "mouse" "cat"
str(stat_mode(bar, return_mult=F, na.rm=T)) # chr "mouse"

সরলকরণের জন্য @ ফ্র্যাঙ্ককে ধন্যবাদ


7

মোডটি তৈরি করতে আমি নিম্নলিখিত কোডটি লিখেছি।

MODE <- function(dataframe){
    DF <- as.data.frame(dataframe)

    MODE2 <- function(x){      
        if (is.numeric(x) == FALSE){
            df <- as.data.frame(table(x))  
            df <- df[order(df$Freq), ]         
            m <- max(df$Freq)        
            MODE1 <- as.vector(as.character(subset(df, Freq == m)[, 1]))

            if (sum(df$Freq)/length(df$Freq)==1){
                warning("No Mode: Frequency of all values is 1", call. = FALSE)
            }else{
                return(MODE1)
            }

        }else{ 
            df <- as.data.frame(table(x))  
            df <- df[order(df$Freq), ]         
            m <- max(df$Freq)        
            MODE1 <- as.vector(as.numeric(as.character(subset(df, Freq == m)[, 1])))

            if (sum(df$Freq)/length(df$Freq)==1){
                warning("No Mode: Frequency of all values is 1", call. = FALSE)
            }else{
                return(MODE1)
            }
        }
    }

    return(as.vector(lapply(DF, MODE2)))
}

চল এটা চেষ্টা করি:

MODE(mtcars)
MODE(CO2)
MODE(ToothGrowth)
MODE(InsectSprays)

6

মোড বা সম্পর্কিত মেট্রিক গণনা করতে ক্রিসের ক্রিয়াকলাপের ভিত্তিতে, তবে ফ্রিকোয়েন্সি গণনা করার জন্য কেন উইলিয়ামসের পদ্ধতিটি ব্যবহার করে। এটি কোনও কোনও মোডের ক্ষেত্রে নয় (সমস্ত উপাদান সমানভাবে ঘন ঘন) এবং আরও কিছু পঠনযোগ্য methodনামগুলির জন্য একটি স্থির সরবরাহ করে।

Mode <- function(x, method = "one", na.rm = FALSE) {
  x <- unlist(x)
  if (na.rm) {
    x <- x[!is.na(x)]
  }

  # Get unique values
  ux <- unique(x)
  n <- length(ux)

  # Get frequencies of all unique values
  frequencies <- tabulate(match(x, ux))
  modes <- frequencies == max(frequencies)

  # Determine number of modes
  nmodes <- sum(modes)
  nmodes <- ifelse(nmodes==n, 0L, nmodes)

  if (method %in% c("one", "mode", "") | is.na(method)) {
    # Return NA if not exactly one mode, else return the mode
    if (nmodes != 1) {
      return(NA)
    } else {
      return(ux[which(modes)])
    }
  } else if (method %in% c("n", "nmodes")) {
    # Return the number of modes
    return(nmodes)
  } else if (method %in% c("all", "modes")) {
    # Return NA if no modes exist, else return all modes
    if (nmodes > 0) {
      return(ux[which(modes)])
    } else {
      return(NA)
    }
  }
  warning("Warning: method not recognised.  Valid methods are 'one'/'mode' [default], 'n'/'nmodes' and 'all'/'modes'")
}

যেহেতু কেনের পদ্ধতিটি ফ্রিকোয়েন্সি গণনা করতে পারফরম্যান্সটিও অনুকূলিত করা হয়েছে, আকসালএর পোস্ট ব্যবহার করে আমি আমার পূর্ববর্তী কয়েকটি উত্তরকে বেনমার্ক করে দেখিয়েছিলাম যে আমার ফাংশনটি কেনের পারফরম্যান্সে খুব কাছাকাছি রয়েছে, যেখানে বিভিন্ন আউটপুট বিকল্পের শর্তসাপেক্ষে কেবল ছোট ছোট ওভারহেড হয়: মোড ফাংশনের তুলনা


আপনি যে কোডটি উপস্থাপন Modeকরছেন তা pracmaপ্যাকেজে পাওয়া ফাংশনের কমবেশি সরাসরি কপি বলে মনে হচ্ছে । বোঝাতে কি যত্ন?
আকসেলা

সত্যি? স্পষ্টতই আমি মোড গণনা করার জন্য এটি ভাল উপায় বলে মনে করার একমাত্র ব্যক্তি নই, তবে আমি সত্যই তা জানতাম না (ঠিক আগে এই প্যাকেজটি আগে কখনও জানত না)। আমি ক্রিসের ফাংশনটি পরিষ্কার করেছিলাম এবং কেনের সংস্করণটি উপকারের মাধ্যমে এটিতে উন্নত করেছি এবং যদি এটি অন্য কারও কোডটির সাথে সাদৃশ্যপূর্ণ তবে এটি খাঁটি কাকতালীয়।
হুগভডবার্গ

আমি এখনই এটি দেখেছি, তবে pracmaআপনি প্যাকেজের কোন সংস্করণ উল্লেখ করেছেন? সংস্করণ 1.9.3 যতদূর আমি দেখতে পাচ্ছি সম্পূর্ণ আলাদা বাস্তবায়ন রয়েছে।
হুগভডবার্গ

2
ফাংশনে সুন্দর সংশোধন। আরও কিছু পড়ার পরে, আমি এই সিদ্ধান্তে পৌঁছে গেছি যে ইউনিফর্ম বা মনোফ্রিকোয়েন্সি বিতরণে নোড রয়েছে কিনা সে বিষয়ে কোনও usক্যমত্য নেই, কিছু উত্স বলছে যে মোডের তালিকাগুলি নিজেই বিতরণ, অন্যরা বলছেন যে নোড নেই। একমাত্র চুক্তিটি হ'ল এই জাতীয় বিতরণের জন্য মোডের একটি তালিকা উত্পাদন করা খুব তথ্যবহুল বা বিশেষভাবে অর্থবহ নয়। যদি আপনি উপরের ফাংশনটি এই জাতীয় ক্ষেত্রে তৈরি করতে চান তবে লাইনটি সরিয়ে ফেলুন: এনমোডস <- ifelse (nmodes == n, 0L, nmodes)
ক্রিস

1
@ গ্রিডিয়োডিয়ো দুঃখিত, আমি আপনার মন্তব্য মিস করেছি। এটি এই গিস্টের
hugovdberg

6

এই হ্যাক ভাল কাজ করা উচিত। মোডের গণনা হিসাবে আপনাকে মান দেয়:

Mode <- function(x){
a = table(x) # x is a vector
return(a[which.max(a)])
}

3

আর এর মধ্যে অনেকগুলি অ্যাড-অন প্যাকেজ রয়েছে যেগুলির মধ্যে কয়েকটি সংখ্যার তালিকা / সিরিজ / ভেক্টরটির [পরিসংখ্যান] মোড সরবরাহ করতে পারে।

তবে নিজেই আর স্ট্যান্ডার্ড লাইব্রেরিতে এমন বিল্ট-ইন পদ্ধতি রয়েছে বলে মনে হয় না! এটিকে ঘিরে কাজ করার একটি উপায় হ'ল নীচের মতো কিছু নির্মাণ ব্যবহার করা (এবং আপনি যদি প্রায়শই ব্যবহার করেন তবে এটি কোনও ফাংশনে পরিণত করা ...):

mySamples <- c(19, 4, 5, 7, 29, 19, 29, 13, 25, 19)
tabSmpl<-tabulate(mySamples)
SmplMode<-which(tabSmpl== max(tabSmpl))
if(sum(tabSmpl == max(tabSmpl))>1) SmplMode<-NA
> SmplMode
[1] 19

বৃহত্তর নমুনা তালিকার জন্য, সর্বোচ্চ (ট্যাবএসএমপিএল) মানের জন্য একটি অস্থায়ী ভেরিয়েবল ব্যবহার করা বিবেচনা করা উচিত (আমি জানি না যে আর এটি স্বয়ংক্রিয়ভাবে অনুকূলিত হবে)

তথ্যসূত্র: দেখুন "মিডিয়ান এবং মোড সম্পর্কে কীভাবে?" এই কিকস্টার্টিং আর পাঠ্যে
এটি নিশ্চিত হয়ে গেছে যে (অন্ততপক্ষে এই পাঠ্য লেখার মতো) আর-তে কোনও মোড ফাংশন নেই (ভাল ... মোড () আপনি যেমন খুঁজে পেয়েছেন যে ভেরিয়েবলের ধরণ যুক্ত করার জন্য ব্যবহৃত হয় )।


3

এটি বেশ সূক্ষ্ম কাজ করে

> a<-c(1,1,2,2,3,3,4,4,5)
> names(table(a))[table(a)==max(table(a))]

3

মোডটি সন্ধান করার জন্য এখানে একটি ফাংশন রয়েছে:

mode <- function(x) {
  unique_val <- unique(x)
  counts <- vector()
  for (i in 1:length(unique_val)) {
    counts[i] <- length(which(x==unique_val[i]))
  }
  position <- c(which(counts==max(counts)))
  if (mean(counts)==max(counts)) 
    mode_x <- 'Mode does not exist'
  else 
    mode_x <- unique_val[position]
  return(mode_x)
}

3

নীচে কোডটি যা আর-তে ভেক্টর ভেরিয়েবলের মোডটি খুঁজতে ব্যবহার করা যেতে পারে is

a <- table([vector])

names(a[a==max(a)])

3

এটির জন্য একাধিক সমাধান সরবরাহ করা হয়েছে। আমি প্রথমটি পরীক্ষা করেছিলাম এবং তারপরে আমার নিজের লেখা। এটি কারও সহায়ক হলে এটি এখানে পোস্ট করা:

Mode <- function(x){
  y <- data.frame(table(x))
  y[y$Freq == max(y$Freq),1]
}

কয়েকটি উদাহরণ দিয়ে এটি পরীক্ষা করতে দেয়। আমি irisডেটা সেট নিচ্ছি । সংখ্যার তথ্য সহ পরীক্ষা করতে দেয়

> Mode(iris$Sepal.Length)
[1] 5

যা আপনি যাচাই করতে পারেন তা সঠিক।

এখন আইরিস ডেটাসেটের একমাত্র অ-সংখ্যাযুক্ত ক্ষেত্রের (স্পেসিস) কোনও মোড নেই। আমাদের নিজস্ব উদাহরণ দিয়ে পরীক্ষা করা যাক

> test <- c("red","red","green","blue","red")
> Mode(test)
[1] red

সম্পাদনা

মন্তব্যে উল্লিখিত হিসাবে, ব্যবহারকারী ইনপুট ধরণের সংরক্ষণ করতে চাইতে পারেন। এই ক্ষেত্রে মোড ফাংশনটি এতে পরিবর্তন করা যেতে পারে:

Mode <- function(x){
  y <- data.frame(table(x))
  z <- y[y$Freq == max(y$Freq),1]
  as(as.character(z),class(x))
}

ফাংশনের শেষ লাইনটি কেবলমাত্র মূল ইনপুটের ধরণের ক্ষেত্রে চূড়ান্ত মোড মানটি জোর করে।


এটি একটি ফ্যাক্টর দেয়, যখন ব্যবহারকারী সম্ভবত ইনপুটটির প্রকারটি সংরক্ষণ করতে চায়। হতে পারে একটি মধ্যম পদক্ষেপ যুক্ত করুনy[,1] <- sort(unique(x))
ফ্রাঙ্ক

2

আমি ঘনত্ব () ফাংশনটি ব্যবহার করবো ধীরে ধীরে (সম্ভবত ধারাবাহিক) বিতরণ শনাক্ত করার জন্য:

function(x) density(x, 2)$x[density(x, 2)$y == max(density(x, 2)$y)]

যেখানে এক্স ডেটা সংগ্রহ। দিতে মনোযোগ সমন্বয় ঘনত্ব ফাংশন যা মসৃণকরণ নিয়ন্ত্রণ এর paremeter।


2

যদিও আমি কেন উইলিয়ামসের সাধারণ ফাংশনটি পছন্দ করি, আমি তাদের একাধিক পদ্ধতি উপস্থিত থাকলে পুনরুদ্ধার করতে চাই। এই বিষয়টি মনে রেখে, আমি নিম্নলিখিত ফাংশনটি ব্যবহার করি যা একাধিক বা একক হলে মোডগুলির একটি তালিকা প্রদান করে।

rmode <- function(x) {
  x <- sort(x)  
  u <- unique(x)
  y <- lapply(u, function(y) length(x[x==y]))
  u[which( unlist(y) == max(unlist(y)) )]
} 

প্রোগ্রামাগুলি ব্যবহারের জন্য এটি আরও সামঞ্জস্যপূর্ণ হবে যদি এটি সর্বদা একটি তালিকা ফেরত দেয় - দৈর্ঘ্য 1 যদি কেবল একটি মোড থাকে
asac

এটি একটি বৈধ পয়েন্ট @ অ্যান্টাইন-স্যাক আমি এই সমাধানটি সম্পর্কে যা পছন্দ করি তা হ'ল ভেক্টর যা ফিরে আসে উত্তরগুলি সহজেই ঠিকানাযোগ্য। R [1] এবং r [2] এ উপলব্ধ মোডগুলির সাহায্যে কেবল ফাংশনের আউটপুটটিকে সম্বোধন করুন: r <- মোড (সি (2, 2, 3, 3))। তবুও, আপনি একটি ভাল পয়েন্ট করতে না !!
র্যান্ডলশনেপিএইচডি

স্পষ্টতই, এখানেই আপনার সমাধানটি কমবে। যদি modeবেশ কয়েকটি মান সহ একটি তালিকা প্রদান করে তবে r [1] প্রথম মান নয়; পরিবর্তে এটি প্রথম মান সমেত দৈর্ঘ্যের 1 এর একটি তালিকা এবং আপনাকে প্রথম তালিকাটি সংখ্যা হিসাবে নয়, তালিকা হিসাবে পেতে [r 1 [[1]] করতে হবে। এখন যখন একটি একক মোড থাকে, তখন আপনার আর কোনও তালিকা নয় তাই r [1] কাজ করে, এ কারণেই আমি ভেবেছিলাম এটি বেমানান। তবে যেহেতু r [[1]] এছাড়াও কাজ করে যখন r একটি সাধারণ ভেক্টর হয়, আসলে একটি ধারাবাহিকতা আমি বুঝতে পারি নি যে আপনি সর্বদা [[উপাদানগুলিতে অ্যাক্সেস ব্যবহার করতে পারেন।
asac

2

আমি এই সমস্ত অপশনটি সন্ধান করছিলাম এবং তাদের আপেক্ষিক বৈশিষ্ট্য এবং পারফরম্যান্স সম্পর্কে অবাক হতে শুরু করেছি, তাই আমি কিছু পরীক্ষা করেছি। যদি অন্য কারও বিষয়ে কৌতূহলী হয় তবে আমি এখানে আমার ফলাফলগুলি ভাগ করছি।

এখানে পোস্ট করা সমস্ত ফাংশন সম্পর্কে মাথা ঘামানোর ইচ্ছে করে না, আমি কয়েকটি মানদণ্ডের উপর ভিত্তি করে একটি নমুনায় ফোকাস করা বেছে নিয়েছি: ফাংশনটি চরিত্র, গুণক, লজিকাল এবং সংখ্যাসূচক ভেক্টর উভয়কেই নিয়ে কাজ করা উচিত, এটি এনএ এবং অন্যান্য সমস্যাযুক্ত মানগুলি যথাযথভাবে মোকাবেলা করা উচিত, এবং আউটপুটটি 'বোধগম্য' হওয়া উচিত, অর্থাত্ চরিত্র বা এই জাতীয় নির্জনতা হিসাবে কোনও সংখ্যাসূচক নয়।

আমি আমার নিজস্ব একটি ফাংশনও যুক্ত করেছি, যা rleখ্রিস্টির মতো একই ধারণার উপর ভিত্তি করে আরও সাধারণ ব্যবহারের জন্য অভিযোজিত ব্যতীত:

library(magrittr)

Aksel <- function(x, freq=FALSE) {
    z <- 2
    if (freq) z <- 1:2
    run <- x %>% as.vector %>% sort %>% rle %>% unclass %>% data.frame
    colnames(run) <- c("freq", "value")
    run[which(run$freq==max(run$freq)), z] %>% as.vector   
}

set.seed(2)

F <- sample(c("yes", "no", "maybe", NA), 10, replace=TRUE) %>% factor
Aksel(F)

# [1] maybe yes  

C <- sample(c("Steve", "Jane", "Jonas", "Petra"), 20, replace=TRUE)
Aksel(C, freq=TRUE)

# freq value
#    7 Steve

আমি পরীক্ষার তথ্য দুটি সেট উপর পাঁচটি ফাংশন চলমান শেষ microbenchmark। ফাংশন নামগুলি তাদের নিজ নিজ লেখকদের উল্লেখ করুন:

এখানে চিত্র বর্ণনা লিখুন

ক্রিস 'ফাংশন হয় method="modes"এবং na.rm=TRUEডিফল্ট ভাবে এটি আরো তুলনীয়, কিন্তু অন্যান্য তুলনায় যে ফাংশন হিসেবে তাদের লেখক দ্বারা এখানে উপস্থাপন করা হয় না।

গতির ক্ষেত্রে একাই কেনস সংস্করণ হস্তান্তরিতভাবে জয়লাভ করে, তবে এটির মধ্যে কেবলমাত্র এটিই কেবল একটি মোডের প্রতিবেদন করবে, সেখানে যতই সত্যই থাকুক না কেন। যেমনটি প্রায়শই ঘটে থাকে, গতি এবং বহুমুখীতার মধ্যে একটি বাণিজ্য রয়েছে। ইন method="mode", ক্রিসের সংস্করণটি যদি একটি মোড থাকে তবে মানটি ফিরিয়ে দেবে, অন্যথায় এনএ। আমি মনে করি এটি একটি দুর্দান্ত স্পর্শ। আমি আরও আকর্ষণীয় বলে মনে করি যে বর্ধিত সংখ্যক অনন্য মানের দ্বারা কিছু ফাংশন কীভাবে প্রভাবিত হয়, অন্যগুলি প্রায় ততটা নয়। কারণ হিসাবে লজিকাল / সংখ্যাসূচক অপসারণ ব্যতীত এটি কেন, তা বের করার জন্য আমি কোডটি বিশদভাবে অধ্যয়ন করি নি।


2

মোড প্রতিটি পরিস্থিতিতে কার্যকর হতে পারে না। সুতরাং ফাংশন এই পরিস্থিতির সমাধান করা উচিত। নিম্নলিখিত ফাংশন চেষ্টা করুন।

Mode <- function(v) {
  # checking unique numbers in the input
  uniqv <- unique(v)
  # frquency of most occured value in the input data
  m1 <- max(tabulate(match(v, uniqv)))
  n <- length(tabulate(match(v, uniqv)))
  # if all elements are same
  same_val_check <- all(diff(v) == 0)
  if(same_val_check == F){
    # frquency of second most occured value in the input data
    m2 <- sort(tabulate(match(v, uniqv)),partial=n-1)[n-1]
    if (m1 != m2) {
      # Returning the most repeated value
      mode <- uniqv[which.max(tabulate(match(v, uniqv)))]
    } else{
      mode <- "Two or more values have same frequency. So mode can't be calculated."
    }
  } else {
    # if all elements are same
    mode <- unique(v)
  }
  return(mode)
}

আউটপুট,

x1 <- c(1,2,3,3,3,4,5)
Mode(x1)
# [1] 3

x2 <- c(1,2,3,4,5)
Mode(x2)
# [1] "Two or more varibles have same frequency. So mode can't be calculated."

x3 <- c(1,1,2,3,3,4,5)
Mode(x3)
# [1] "Two or more values have same frequency. So mode can't be calculated."

দুঃখিত, আমি কেবল দেখতে পাচ্ছি না যে এটি ইতিমধ্যে পোস্ট করাতে কীভাবে নতুন কিছু যুক্ত করে। এছাড়াও আপনার আউটপুট উপরের আপনার ফাংশনের সাথে অসঙ্গত বলে মনে হচ্ছে।
not2qubit

2

এটি খুব সংক্ষিপ্ত ভেক্টরগুলির জন্য একটি গতি যুক্ত করে, জেপ্রকবেলির উত্তরের উপর ভিত্তি করে। এটি একটি ডেটা মোডে প্রয়োগ করার সময় কার্যকর হয় ra

Mode <- function(x) {
   if ( length(x) <= 2 ) return(x[1])
   if ( anyNA(x) ) x = x[!is.na(x)]
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}

1

আর একটি সহজ বিকল্প যা ফ্রিকোয়েন্সি অনুসারে আদেশ করা সমস্ত মান দেয় তা হ'ল rle:

df = as.data.frame(unclass(rle(sort(mySamples))))
df = df[order(-df$lengths),]
head(df)

1

আর একটি সম্ভাব্য সমাধান:

Mode <- function(x) {
    if (is.numeric(x)) {
        x_table <- table(x)
        return(as.numeric(names(x_table)[which.max(x_table)]))
    }
}

ব্যবহার:

set.seed(100)
v <- sample(x = 1:100, size = 1000000, replace = TRUE)
system.time(Mode(v))

আউটপুট:

   user  system elapsed 
   0.32    0.00    0.31 

1

আমি মামলা আপনার পর্যবেক্ষণ হয় ক্লাস থেকে বাস্তব সংখ্যার এবং আপনি সেই আশা মোড 2.5 হতে যখন আপনার পর্যবেক্ষণ 2, 2, 3, এবং 3 তারপর আপনার সাথে মোড অনুমান পারে mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)যেখানে L1 ..lower অধিকাংশ ঘন শ্রেণীর সীমা, F1 । সর্বাধিক ঘন ক্লাসের ফ্রিকোয়েন্সি, f0 .. সর্বাধিক ঘন ক্লাসের আগে ক্লাসের ফ্রিকোয়েন্সি, f2 .. সর্বাধিক ঘন ক্লাসের পরে ক্লাসের ফ্রিকোয়েন্সি এবং i .. ক্লাস ব্যবধান যেমন 1 , 2 , 3 তে দেওয়া হয়েছে :

#Small Example
x <- c(2,2,3,3) #Observations
i <- 1          #Class interval

z <- hist(x, breaks = seq(min(x)-1.5*i, max(x)+1.5*i, i), plot=F) #Calculate frequency of classes
mf <- which.max(z$counts)   #index of most frequent class
zc <- z$counts
z$breaks[mf] + i * (zc[mf] - zc[mf-1]) / (2*zc[mf] - zc[mf-1] - zc[mf+1])  #gives you the mode of 2.5


#Larger Example
set.seed(0)
i <- 5          #Class interval
x <- round(rnorm(100,mean=100,sd=10)/i)*i #Observations

z <- hist(x, breaks = seq(min(x)-1.5*i, max(x)+1.5*i, i), plot=F)
mf <- which.max(z$counts)
zc <- z$counts
z$breaks[mf] + i * (zc[mf] - zc[mf-1]) / (2*zc[mf] - zc[mf-1] - zc[mf+1])  #gives you the mode of 99.5

আপনি যদি সর্বাধিক ঘন স্তর চান এবং আপনার একাধিক ঘন স্তর রয়েছে তবে আপনি সেগুলি পেতে পারেন যেমন:

x <- c(2,2,3,5,5)
names(which(max(table(x))==table(x)))
#"2" "5"

1

একটি সম্ভাব্য ডেটা যোগ করা হচ্ছে able টেবিল পদ্ধতির

library(data.table)
#for single mode
dtmode <- function(x) x[which.max(data.table::rowid(x))]

#for multiple modes
dtmodes <- function(x) x[{r <- rowid(x); r==max(r)}]

1

থেটা (এন) চলমান সময় আপনি এটি করতে পারেন এমন কয়েকটি উপায় এখানে

from collections import defaultdict

def mode1(L):
    counts = defaultdict(int)
    for v in L:
        counts[v] += 1
    return max(counts,key=lambda x:counts[x])
def mode2(L):
    vals = set(L)
    return max(vals,key=lambda x: L.count(x))
def mode3(L):
    return max(set(L), key=lambda x: L.count(x))

0

নিম্নলিখিত ফাংশন চেষ্টা করতে পারে:

  1. সংখ্যার মানগুলিকে ফ্যাক্টারে রূপান্তর করুন
  2. ফ্রিকোয়েন্সি টেবিল পেতে সারসংক্ষেপ () ব্যবহার করুন
  3. রিটার্ন মোড সূচক যার ফ্রিকোয়েন্সি বৃহত্তম
  4. সংখ্যার তুলনায় ফ্যাক্টরটিকে রূপান্তর করুন এমনকি 1 টিরও বেশি মোড রয়েছে, এই ফাংশনটি ভালভাবে কাজ করে!
mode <- function(x){
  y <- as.factor(x)
  freq <- summary(y)
  mode <- names(freq)[freq[names(freq)] == max(freq)]
  as.numeric(mode)
}

0

মোড গণনা করা বেশিরভাগ ক্ষেত্রে ফ্যাক্টর ভেরিয়েবলের ক্ষেত্রে হয় তবে আমরা ব্যবহার করতে পারি

labels(table(HouseVotes84$V1)[as.numeric(labels(max(table(HouseVotes84$V1))))])

হাউসভিটেস 84 ডেটাসেটটি 'এমএলবেঞ্চ' প্যাকেজে উপলব্ধ।

এটি সর্বোচ্চ লেবেল মান দেবে। ফাংশন না লিখে নিজেই ইনবিল্ট ফাংশন ব্যবহার করা সহজ।


0

আমার কাছে মনে হয় যদি কোনও সংগ্রহে কোনও মোড থাকে, তবে এর উপাদানগুলি প্রাকৃতিক সংখ্যার সাথে একের পর এক ম্যাপ করা যায়। সুতরাং, মোডটি খুঁজে পাওয়ার সমস্যা যেমন ম্যাপিং উত্পাদন করতে পারে, ম্যাপযুক্ত মানগুলির মোডটি খুঁজে বের করে, তারপরে সংগ্রহের কিছু আইটেমের সাথে ম্যাপিং করতে পারে। (সাথে ডিলিংNA ম্যাপিং পর্যায়ে এর ঘটে)।

আমার একটি histogramফাংশন রয়েছে যা একই প্রিন্সিপালের উপর পরিচালনা করে। (এখানে উপস্থাপিত কোডে ব্যবহৃত বিশেষ ফাংশন এবং অপারেটরগুলি শাপিরো এবং / বা নেটওভারসে সংজ্ঞায়িত করা উচিত Sha শাপিরো এবং neatOveRse এর অংশগুলি এখানে অনুমতি সহ নকল হয়েছে; সদৃশ স্নিপেটগুলি এই সাইটের শর্তাদির অধীনে ব্যবহার করা যেতে পারে। ) আর pseudocode হয় জন্য histogramহল

.histogram <- function (i)
        if (i %|% is.empty) integer() else
        vapply2(i %|% max %|% seqN, `==` %<=% i %O% sum)

histogram <- function(i) i %|% rmna %|% .histogram

(বিশেষ বাইনারি অপারেটরগুলি পাইপিং , কারিঙ এবং সংমিশ্রণ সম্পাদন করে ) আমারও একটি maxlocফাংশন রয়েছে যা এর অনুরূপ which.maxতবে ভেক্টরের সমস্ত পরম ম্যাক্সিমাকে ফিরিয়ে দেয়। আর pseudocode হয় জন্য maxlocহল

FUNloc <- function (FUN, x, na.rm=F)
        which(x == list(identity, rmna)[[na.rm %|% index.b]](x) %|% FUN)

maxloc <- FUNloc %<=% max

minloc <- FUNloc %<=% min # I'M THROWING IN minloc TO EXPLAIN WHY I MADE FUNloc

তারপর

imode <- histogram %O% maxloc

এবং

x %|% map %|% imode %|% unmap

যে কোনও সংগ্রহের মোড গণনা করা হবে, প্রদত্ত উপযুক্ত- mapচাপ এবং unmap-কার্যকারিতা সংজ্ঞায়িত করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.