2017-05-17 44 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)] 
相关问题