R:使用dplyr嵌套分组摘要?

时间:2016-05-04 17:46:34

标签: r dplyr summarization

我尝试用不同酒吧的人们饮酒记录的假设数据集(link to pastebin)来练习R makeList<-function(x){ if(ncol(x)>2){ listSplit<-split(x[-1],x[1],drop=T) lapply(names(listSplit),function(y){ if(as.character(listSplit[[y]][1,1]) > 0){ list(name=y,children=makeList(listSplit[[y]])) } else { list(name=y,size=listSplit[[y]][1,2]) } }) }else{ lapply(seq(nrow(x[1])),function(y){list(name=x[,1][y],size=x[,2][y])}) } } 套餐:

dplyr

我曾多次使用dplyr的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 group_by()函数,但我不确定如何处理更多嵌套情况。具体来说,我想问一些问题:

  1. 对于每个唯一summarise(),每个bar_name订购完全相同的饮品组合(person)?在这个数据集中,对于Moe's Tavern,Cheers和Mos Eisley酒吧,这将标记为drink_ordered

  2. 即使每个TRUE订购了特定person的完全相同的饮品组合,他们是否订购了相同次数的饮料(bar_name)?例如,Moe's Tavern和Mos Eisley将这个问题标记为times_ordered

  3. 然后,即使每个TRUE在特定酒吧中订购完全相同的饮料组合次数相同,他们对饮料的看法(person)是否完全相同?在这个Mos Eisley的liked_it数据集中。

  4. 观察数据集中的情况(髋关节),对于所有三个问题,答案为TRUE,并且存在缺失值(十个前进)。

    理想情况下,我希望生成一个表格,其中第一列为FALSE,另外三个布尔列表示bar_nameTRUE三个问题。

    如何使用R中的FALSE有效实现此目的?非常感谢你。

1 个答案:

答案 0 :(得分:5)

你可以这样做:

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