根据模态观测数创建一个新变量

时间:2017-05-17 01:56:57

标签: r dplyr

我正在尝试创建一个基于单个变量的观察模型数量的新变量。

使用此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()) 

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

使用dplyr,我们可以按idepisode分组并使用table我们找到每个provider的频率,并选择which.max的最大值{1}}。

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

类似的情况可以通过基础R的ave来实现

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

答案 2 :(得分:1)

我们可以创建显示here

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

}

然后使用data.table,按照&#39; id&#39;,&#39; episode&#39;分组,我们得到了&#39;模式&#39; &#39;提供商&#39;

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