【问题标题】:Collapsing columns based on differences between groups using dplyr使用 dplyr 根据组之间的差异折叠列
【发布时间】: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 %&gt;% group_by(year) %&gt;% summarise_at(vars(-id), diff)?我不确定你想要什么;不到两个电话就很难做到。
  • @alistaire,您可能还想arrange(id) 以确保所有组始终以id 相同的方式排序。
  • 没错,我不太确定数据可以采取哪些可能的安排;如果出现故障或每个yearid 有超过一排或有其他ids,则需要进行更多清洁。

标签: r dplyr tidyr


【解决方案1】:

我们可以使用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

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2014-11-05
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多