R 进行变异+;分组数据框上的筛选与摘要?

R 进行变异+;分组数据框上的筛选与摘要?,r,dplyr,R,Dplyr,在dplyr 0.5.0中,对分组数据帧调用summary不能保证任何结果行顺序(目前,它按组重新排序行,不确定如何处理重复的分组级别) 为了解决这个问题,我想用mutate(x=…)%%>%filter(row_number()==1)替换所有summary(x=…)操作。这样做有什么缺点或缺点吗 这两个操作的示例 tmp_df <- data.frame(group = rep(c(2L, 1L), each = 5), b = rep(c(-1, 1), each = 5)

dplyr 0.5.0
中,对分组数据帧调用
summary
不能保证任何结果行顺序(目前,它按组重新排序行,不确定如何处理重复的分组级别)

为了解决这个问题,我想用
mutate(x=…)%%>%filter(row_number()==1)
替换所有
summary(x=…)
操作。这样做有什么缺点或缺点吗

这两个操作的示例

tmp_df <- 
    data.frame(group = rep(c(2L, 1L), each = 5), b = rep(c(-1, 1), each = 5)) %>%
    group_by(group)

tmp_df %>%
    summarise(b = sum(b))

tmp_df %>%
    mutate(b = sum(b)) %>%
    filter(row_number() == 1)

一个选项是将“组”创建为
因子

tmp_df <- data.frame(group = rep(c(2L, 1L), each = 5), b = rep(c(-1, 1), each = 5)) %>%
             group_by(group = factor(group, levels = unique(group)))

tmp_df %>%
    summarise(b = sum(b))
# A tibble: 2 x 2
#    group     b
#   <fctr> <dbl>
#1      2    -5
#2      1     5
tmp_df%
分组依据(组=系数(组,级别=唯一(组)))
tmp_df%>%
总结(b=总和(b))
#一个tibble:2x2
#b组
#    
#1      2    -5
#2      1     5

summary()
对我来说似乎更具可读性/意义,因为这就是你正在做的。如果行顺序如此重要,那么以后再排序。我愿意牺牲可读性来保留行顺序,因为在分析过程中,我可能已经忘记了如何对数据帧进行排序。(事实上,我真正想要的是定义一个新的摘要函数来取代mutate+过滤器)。使用data.table:
tmp\u df%>%data.table%>%group\u by(group)%%>%summary(b=sum(b))
为我显示了预期的顺序。我正在加载data.table包而不是dtplyr,但我想它的工作原理是一样的。(我使用的是
data.table()
而不是
setDT()
,因为它更符合dplyr的“不要修改”原则。)@Frank,整洁!但我有点害怕这会起作用!如果文档没有明确说明它保留了顺序,那么很可能是
数据。table
版本将在下一个版本中开始执行相同的操作,因此请小心。这非常简洁,但在正常使用中可能会有多个分组变量,我想你可以创建一个组索引或其他东西。@Alex如果有多个组,那么
df1%>%mutate\u at(vars(colsofinterest)、funs(factor(,levels=unique()))%>%group\u by_uuu(.dots=colsofinterest)
summarise_o <- function (.data, ...) {
    # order preserving summarise
    mutate_(.data, .dots = lazyeval::lazy_dots(...)) %>%
        filter(row_number() == 1) %>% 
        return
}
tmp_df %>%
    summarise_o(b = sum(b))
tmp_df <- data.frame(group = rep(c(2L, 1L), each = 5), b = rep(c(-1, 1), each = 5)) %>%
             group_by(group = factor(group, levels = unique(group)))

tmp_df %>%
    summarise(b = sum(b))
# A tibble: 2 x 2
#    group     b
#   <fctr> <dbl>
#1      2    -5
#2      1     5