2017-10-20 50 views
1

我想計算分類變量的最頻繁值。我嘗試使用modeest軟件包中的mlv函數,但獲得了NAs。R中的分類變量的統計模式(使用mlv)

user <- c("A","B","A","A","B","A","B","B") 
color <- c("blue","green","blue","blue","green","yellow","pink","blue") 
df <- data.frame(user,color) 
df$color <- as.factor(df$color) 

library(plyr) 
library(dplyr) 
library(modeest) 

summary <- ddply(df,.(user),summarise,mode=mlv(color,method="mlv")[['M']]) 

Warning messages: 
1: In discrete(x, ...) : NAs introduced by coercion 
2: In discrete(x, ...) : NAs introduced by coercion 

summary 
    user mode 
1 A NA 
2 B NA 

然而,我需要這樣的:

user mode 
A  blue 
B  green 

我在做什麼錯?我嘗試過使用其他方法,以及mlv(x=color)。根據modeest的幫助頁面,它應該適用於各種因素。

我不想使用table(),因爲我需要一個簡單的函數來創建一個類似於這個問題的彙總表:How to get the mode of a group in summarize in R,但是對於一個分類列。

+1

也許還有相關性:[*「是否有內置函數用於查找模式?」](https://stackoverflow.com/q/2547402/2204410) – Jaap

回答

0

原因modeest::mlv.factor()不起作用可能實際上是包中的一個錯誤。

在函數mlv.factor()中調用函數modeest:::discrete()。在那裏,這是發生了什麼:

f <- factor(color) 
[1] blue green blue blue green yellow pink blue 
Levels: blue green pink yellow 

tf <- tabulate(f) 
[1] 4 2 1 1 

as.numeric(levels(f)[tf == max(tf)]) 
[1] NA 
Warning message: 
NAs introduced by coercion 

這是返回到mlv.fator()。但levels(f)[tf == max(tf)]等於[1] "blue",因此as.numeric()無法將其轉換爲數字。

您可以通過查找唯一值並計算它們出現在向量中的次數來計算模式。然後,您可以子集唯一值出現最愛的人(即模式)

找到獨特的顏色:

unique_colors <- unique(color) 

match(color, unique_colors)返回colorunique_colors第一場比賽的位置。 tabulate()然後計算出現顏色的次數。 which.max()返回最高發生值的索引。這個值然後可以被用於子集獨特的顏色。

unique_colors[which.max(tabulate(match(color, unique_colors)))] 

或許更具可讀性使用dplyr

library(dplyr) 
unique(color)[color %>% 
       match(unique(color)) %>% 
       tabulate() %>% 
       which.max()] 

返回這兩個選項:

[1] blue 
Levels: blue green pink yellow 

編輯:

可能是創建自己的模式功能的最佳方式:

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

,然後用它在dplyr::summarise()

library(dplyr) 

df %>% 
    group_by(user) %>% 
    summarise(color = calculate_mode(color)) 

將返回:

# A tibble: 2 x 2 
    user color 
    <fctr> <fctr> 
1  A blue 
2  B green 
+0

感謝您的詳細解釋!我現在明白了爲什麼mlv不起作用。但是,我提供的例子只是一個示例問題。我實際上想要計算我的龐大數據庫中另一列的每個唯一值的模式值(大約100萬個樣本,10000個唯一值),也許使用dplyr :: summarize ..還有什麼我可以用來計算模式的功能性的方式? – cantordust

+0

我已將示例更改爲更能反映我的問題。 – cantordust

+0

非常感謝Clemens!將按照您的建議創建該功能。我想避免這樣做,因爲我覺得它可能效率低下,但似乎是目前唯一的選擇。奇怪的是像R這樣的統計工具沒有內置模式計算器。 – cantordust

1

你應該嘗試table。例如,which.max(table(color))

+0

感謝您的提示!這只是一個簡單的例子問題。我實際上想要計算我的龐大數據庫中另一列的每個唯一值的模式值(大約100萬個樣本,10000個唯一值),也許使用dplyr :: summarize ..還有什麼我可以用來計算模式的功能性的方式? – cantordust

+0

我已將示例更改爲更能反映我的問題。 – cantordust