dplyr:特定汇总某些列的方法,其余列的默认值

时间:2017-03-10 09:30:16

标签: r dataframe dplyr

我想总结一个分组的数据框。对于某些列,我需要一个特定的聚合方法,下面例如在d连接字符串,对于其他列我应用默认方法(在first下面)。我找到了一种方法,通过将列与特定方法分离到另一个数据帧。这是非常复杂的,5行代码,3个分组,如果我有更多这样的列,或者其中一些是double类型会怎么样。我想知道是否有更简单的方法来做到这一点?例如,如果我们可以将first作为summarise_all的默认方法和仅针对某些列的特定方法传递,那将是完美的。我已经阅读了文档并得出结论认为这是不可能的。

require(dplyr)

df <- data.frame(
    a = sort(rep(letters[1:4], 5)),
    b = rep(letters[6:7], 10),
    c = rnorm(20, 1000, 500),
    d = rep(c('h', 'h', 'i', 'h'), 5)
)

grp <- df %>% group_by(a, b, d) %>% summarise_all(first)
grp_d <- grp %>% group_by(a, b) %>% summarise(d = paste(d, collapse = ""))
grp_d$d <- factor(grp_d$d)
grp_othercols <- grp %>% group_by(a, b) %>% summarise_all(first)
merged <- bind_cols(grp_othercols %>% select(-d),
                    as.data.frame(grp_d['d']))

2 个答案:

答案 0 :(得分:2)

感谢Axeman的评论,只有一个分组:

df %>% group_by(a, b, d) %>% summarise_all(first) %>% 
  mutate(d = factor(paste(d, collapse = ""))) %>% 
  summarise_all(first)

答案 1 :(得分:1)

我们还可以将多个函数传递给summarize_all,然后只选择我们感兴趣的列:

df %>% 
    group_by(a, b) %>% 
    arrange(a, b, d) %>%
    summarise_all(c('c', 'd'), funs(paste = paste(unique(.), collapse = ''), f = first)) %>% 
    select(-c_paste, -d_f)

请注意arrange(),因为我们从未对d进行分组,因此不会对其进行排序,first会略有不同的结果。