我正在尝试创建一个基于单个变量的观察模型数量的新变量。
使用此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())
答案 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
,我们可以按id
和episode
分组并使用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)]