【发布时间】:2017-06-03 12:03:01
【问题描述】:
我想跨组折叠多个列,以便剩余的汇总统计数据是每个组的列值之间的差异。我有两种方法,但我觉得应该有更好的方法。
示例数据
library(dplyr)
library(tidyr)
test <- data.frame(year = rep(2010:2011, each = 2),
id = c("A","B"),
val = 1:4,
val2 = 2:5,
stringsAsFactors = F)
使用summarize_each
test %>%
group_by(year) %>%
summarize_each(funs(.[id == "B"] - .[id == "A"]), val, val2)
使用 tidyr
test %>%
gather(key,val,val:val2) %>%
spread(id,val) %>%
mutate(B.less.A = B - A) %>%
select(-c(A,B)) %>%
spread(key,B.less.A)
summary_each 方式似乎相对简单,但我觉得有一种方法可以通过以某种方式对 id 进行分组来做到这一点?有没有办法可以忽略列中的 NA 值?
【问题讨论】:
-
test %>% group_by(year) %>% summarise_at(vars(-id), diff)?我不确定你想要什么;不到两个电话就很难做到。 -
@alistaire,您可能还想
arrange(id)以确保所有组始终以id相同的方式排序。 -
没错,我不太确定数据可以采取哪些可能的安排;如果出现故障或每个
year和id有超过一排或有其他ids,则需要进行更多清洁。