2017-05-17 77 views
1

我想創建一個基於單獨變量的觀測值的模型編號的新變量。根據觀測的模態數創建一個新變量

使用這個DF:

help <- data.frame(
id = c(rep(05, times = 8), rep(10, times = 8), rep(12, times = 8)), 
episode = c(rep(1, times = 4), rep(2, times =4), rep(3, times = 8), rep(1, times = 4), rep(2, times =4)), 
provider = c(rep(70, times = 2), rep(80, times = 2), rep(70, times = 4), rep(30, times = 6), rep(40, times = 2), rep(70, times = 4), rep(10, times = 4))) 

我希望創建一個新的變量,是基於模態提供商provider_mode,或以最意見提供者,每次發作。

年底DF應該是這樣的:

id episode provider provider_mode 
5  1  70  70 
5  1  70  70 
5  1  80  70 
5  1  80  70 
5  2  70  70 
5  2  70  70 
5  2  70  70 
5  2  70  70 
10  3  30  30 
10  3  30  30 
10  3  30  30 
10  3  30  30 
10  3  30  30 
10  3  30  30 
10  3  40  30 
10  3  40  30 
12  1  70  70 
12  1  70  70 
12  1  70  70 
12  1  70  70 
12  2  10  10 
12  2  10  10 
12  2  10  10 
12  2  10  10 

這裏是我想出了迄今爲止的代碼,但它只是讓我對每個情節中的每個供應商的數量。我需要創建一個mutate命令,使得提供者觀察得最多,如果存在平局,請選擇第一個提供者(例如,id 5內的提供者70)。

help %>% group_by(id, episode, provider) %>% mutate(provider_count = n()) 

回答

2

隨着dplyr我們可以通過idepisode組,並使用table我們找到每個provider的頻率並用which.max選擇它的最大值。

library(dplyr) 
help %>% 
    group_by(id, episode) %>% 
    mutate(provider_mode = names(which.max(table(provider)))) 

#  id episode provider provider_mode 
# <dbl> <dbl> <dbl>   <chr> 
#1  5  1  70   70 
#2  5  1  70   70 
#3  5  1  80   70 
#4  5  1  80   70 
#5  5  2  70   70 
#6  5  2  70   70 
#7  5  2  70   70 
#8  5  2  70   70 
#9  10  3  30   30 
#10 10  3  30   30 
# ... with 14 more rows 

而且也可能出現相似ave從基礎R實現

help$provider_mode <- ave(help$provider, help$id, help$episode, FUN = function(x) 
             names(which.max(table(x)))) 
2

問題是R實際上沒有mode()函數來計算統計模式。我們可以僞造其與dplyr()通過計算計數,然後將其合併回。例如,如果您的數據存儲在一個名爲dd變量,

dd %>% 
    group_by(id, episode) %>% 
    count(provider) %>% 
    top_n(1, n) %>% 
    filter(row_number()==1) %>% 
    select(-n) %>% 
    rename(provider_mode=provider) %>% 
    right_join(dd) 
+0

的「模式」我不知道'top_n'將在領帶的情況下返回多行。我添加了一個額外的過濾器,每個ID只返回一個值。 – MrFlick

+0

只要我應付'group_by(id,episode)'... ...,如果我不'按照情節分組,那麼這個工作方式就會生效,id 12的提供者在兩個劇集中保持不變。謝謝,輕彈。 – bpace

1

我們可以創建一個Mode功能顯示here

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

}

,然後用data.table ,按分組「ID」,「插曲」,我們得到的「供應商」

library(data.table) 
setDT(help)[, provider_mode := Mode(provider), by = .(id, episode)] 
相關問題