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

Однако для этого поста у меня есть дополнительная проблема, где заказы на напитки некоторых людей были unspecifiedQuark's Bar), а некоторые заказали water:

  1. За unspecified Я хочу, чтобы он действовал как "универсальный" напиток, чтобы его не считали другим напитком (если бы в этом баре были заказаны другие напитки). Например, в Quark's Bar Я хочу, чтобы результат был TRUE что все заказали один и тот же напиток. Конечно, если в баре все только заказали unspecified результат будет TRUE, тоже.

  2. За water Я обычно хочу, чтобы это игнорировалось (например, потому что это не алкогольный напиток!), Поэтому сначала я подумал, что могу просто использовать dplyr filter() удалить строки данных, где был порядок water, Сложность в том, что я хочу, чтобы результаты были TRUE когда люди заказывали только water например, в Maz's Tavern, Так что я не думаю, что могу просто удалить строки с water Я хочу, чтобы они были рассмотрены! Другими словами, я не хочу water считать, если это не единственная уникальная вещь, когда-либо заказанная в этом bar_name,

Есть ли способ условно (это правильный термин?) Иметь дело с "исключительными" предметами, такими как water или же unspecified? Я предпочитаю решение на основе dplyr (т. Е. Hadley-verse), которое создает таблицу, подобную той, которую @Frank сделала с кодом выше, который учитывает эти два элемента, хотя все, что вы можете придумать, будет оценено. Спасибо!

0 ответов

Другие вопросы по тегам