我想总结一个分组的数据框。对于某些列,我需要一个特定的聚合方法,下面例如在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']))
答案 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
会略有不同的结果。