我尝试用不同酒吧的人们饮酒记录的假设数据集(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()
函数,但我不确定如何处理更多嵌套情况。具体来说,我想问一些问题:
对于每个唯一summarise()
,每个bar_name
订购完全相同的饮品组合(person
)?在这个数据集中,对于Moe's Tavern,Cheers和Mos Eisley酒吧,这将标记为drink_ordered
。
即使每个TRUE
订购了特定person
的完全相同的饮品组合,他们是否订购了相同次数的饮料(bar_name
)?例如,Moe's Tavern和Mos Eisley将这个问题标记为times_ordered
。
然后,即使每个TRUE
在特定酒吧中订购完全相同的饮料组合次数相同,他们对饮料的看法(person
)是否完全相同?在这个Mos Eisley的liked_it
数据集中。
观察数据集中的情况(髋关节),对于所有三个问题,答案为TRUE
,并且存在缺失值(十个前进)。
理想情况下,我希望生成一个表格,其中第一列为FALSE
,另外三个布尔列表示bar_name
或TRUE
三个问题。
如何使用R中的FALSE
有效实现此目的?非常感谢你。
答案 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