使用dplyr根据组之间的差异折叠列

时间:2017-01-18 22:41:55

标签: r dplyr tidyr

我希望在组之间折叠多个列,以便剩余的摘要统计信息是每个组的列值之间的差异。我有两种方法,但我觉得有一种更好的方法可以做到这一点。

示例数据

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)
总结_each方式似乎相对简单,但我觉得有一种方法可以通过分组id某种方式来做到这一点?有没有办法可以忽略列中的NA值?

1 个答案:

答案 0 :(得分:0)

我们可以使用data.table

library(data.table)
setDT(test)[, lapply(.SD, diff), by = year, .SDcols = val:val2]
#   year val val2
#1: 2010   1    1
#2: 2011   1    1