R: Условные вложенные сгруппированные аннотации с dplyr?
Спасибо @Frank за мой предыдущий пост (подробности там), где я смог ответить на несколько вопросов о наборе данных о характере употребления алкоголя людьми в барах:
bar_name,person,drink_ordered,times_ordered,liked_it
Moe’s Tavern,Homer,Romulan ale,2,TRUE
Moe’s Tavern,Homer,Scotch whiskey,1,FALSE
Moe’s Tavern,Guinan,Romulan ale,1,TRUE
Moe’s Tavern,Guinan,Scotch whiskey,3,FALSE
Moe’s Tavern,Rebecca,Romulan ale,2,FALSE
Moe’s Tavern,Rebecca,Scotch whiskey,4,TRUE
Cheers,Rebecca,Budweiser,1,TRUE
Cheers,Rebecca,Black Hole,1,TRUE
Cheers,Bender,Budweiser,1,FALSE
Cheers,Bender,Black Hole,1,TRUE
Cheers,Krusty,Budweiser,1,TRUE
Cheers,Krusty,Black Hole,1,FALSE
The Hip Joint,Homer,Scotch whiskey,3,FALSE
The Hip Joint,Homer,Corona,1,TRUE
The Hip Joint,Homer,Budweiser,1,FALSE
The Hip Joint,Krusty,Romulan ale,3,TRUE
The Hip Joint,Krusty,Black Hole,4,FALSE
The Hip Joint,Krusty,Corona,1,TRUE
The Hip Joint,Rebecca,Corona,2,TRUE
The Hip Joint,Rebecca,Romulan ale,4,FALSE
The Hip Joint,Bender,Corona,1,TRUE
Ten Forward,Bender,Romulan ale,1,
Ten Forward,Bender,Black Hole,,FALSE
Ten Forward,Guinan,Romulan ale,2,TRUE
Ten Forward,Guinan,Budweiser,,FALSE
Ten Forward,Krusty,Budweiser,1,
Ten Forward,Krusty,Black Hole,1,FALSE
Mos Eisley,Krusty,Black Hole,1,TRUE
Mos Eisley,Krusty,Corona,2,FALSE
Mos Eisley,Krusty,Romulan ale,1,TRUE
Mos Eisley,Homer,Black Hole,1,TRUE
Mos Eisley,Homer,Corona,2,FALSE
Mos Eisley,Homer,Romulan ale,1,TRUE
Mos Eisley,Bender,Black Hole,1,TRUE
Mos Eisley,Bender,Corona,2,FALSE
Mos Eisley,Bender,Romulan ale,1,TRUE
Quark’s Bar,Bender,Black Hole,1,TRUE
Quark’s Bar,Bender,water,1,FALSE
Quark’s Bar,Bender,unspecified,1,TRUE
Quark’s Bar,Homer,Black Hole,2,FALSE
Quark’s Bar,Guinan,unspecified,2,TRUE
Quark’s Bar,Guinan,Black Hole,1,TRUE
Quark’s Bar,Krusty,Black Hole,1,FALSE
Quark’s Bar,Krusty,water,2,FALSE
Quark’s Bar,Rebecca,unspecified,1,FALSE
Maz’s Tavern,Krusty,water,1,TRUE
Maz’s Tavern,Rebecca,water,1,FALSE
Maz’s Tavern,Homer,water,1,TRUE
Maz’s Tavern,Bender,water,2,FALSE
В частности, @Frank предложил этот код:
DF %>%
arrange(drink_ordered, times_ordered, liked_it) %>% group_by(bar_name, person) %>%
summarise(
Ld = toString(drink_ordered),
Ldt = paste(Ld, toString(times_ordered), sep="_"),
Ldtl = paste(Ldt, toString(liked_it), sep="_")
) %>%
group_by(bar_name) %>%
summarise_each(funs(n_distinct)) %>%
mutate_each(funs(. == 1), -person, -bar_name)
Который производит сгруппированные сводки о том, заказывали ли клиенты в каждом баре одни и те же напитки, сколько их, и нравились ли они им:
# bar_name person Ld Ldt Ldtl
# (chr) (int) (lgl) (lgl) (lgl)
# 1 Cheers 3 TRUE TRUE FALSE
# 2 Moe’s Tavern 3 TRUE FALSE FALSE
# 3 Mos Eisley 3 TRUE TRUE TRUE
# 4 Ten Forward 3 FALSE FALSE FALSE
# 5 The Hip Joint 4 FALSE FALSE FALSE
Однако для этого поста у меня есть дополнительная проблема, где заказы на напитки некоторых людей были unspecified
(в Quark's Bar
), а некоторые заказали water
:
За
unspecified
Я хочу, чтобы он действовал как "универсальный" напиток, чтобы его не считали другим напитком (если бы в этом баре были заказаны другие напитки). Например, вQuark's Bar
Я хочу, чтобы результат былTRUE
что все заказали один и тот же напиток. Конечно, если в баре все только заказалиunspecified
результат будетTRUE
, тоже.За
water
Я обычно хочу, чтобы это игнорировалось (например, потому что это не алкогольный напиток!), Поэтому сначала я подумал, что могу просто использовать dplyrfilter()
удалить строки данных, где был порядокwater
, Сложность в том, что я хочу, чтобы результаты былиTRUE
когда люди заказывали толькоwater
например, вMaz's Tavern
, Так что я не думаю, что могу просто удалить строки сwater
Я хочу, чтобы они были рассмотрены! Другими словами, я не хочуwater
считать, если это не единственная уникальная вещь, когда-либо заказанная в этомbar_name
,
Есть ли способ условно (это правильный термин?) Иметь дело с "исключительными" предметами, такими как water
или же unspecified
? Я предпочитаю решение на основе dplyr (т. Е. Hadley-verse), которое создает таблицу, подобную той, которую @Frank сделала с кодом выше, который учитывает эти два элемента, хотя все, что вы можете придумать, будет оценено. Спасибо!