首页 > 解决方案 > 如何使用其他列中的值作为键来减去特定列的值

问题描述

如何使用c作为参考(post-pre)bd作为键减去最后三列中的值?

输入

df1 <- tribble(
  ~a, ~b, ~c, ~d, ~e, ~f, ~g,
  "1396-006_post_B", "1396-006", "post", "B", 18, 16, 0,
  "1396-006_post_L", "1396-006", "post", "L", 7, 15, 0,
  "1396-006_pre_B", "1396-006", "pre", "B", 16, 9, 0,
  "1396-006_pre_L", "1396-006", "pre", "L", 2, 1, 0,
  "1396-053_post_B", "1396-053", "post", "B", 25, 58, 0,
  "1396-053_pre_B", "1396-053", "pre", "B", 24, 27, 0
)

输出

1396-006_B  2 7 0
1396-006_L  5 14  0
1396-053_B  1 31  0

试过了

df1 %>% 
  group_by(b, d) %>% 
  mutate_all(funs(diff))%>%
  ungroup()

标签: rtidyverse

解决方案


可能有更好的方法可以做到这一点,但我选择了

(df1 
    %>% group_by(b,d) 
    %>% arrange(c)
    %>% summarise_at(vars(e:g),funs(-1*diff(.)))
)
  • 使用summarise_at()而不是mutate_at()
  • 用于-1*diff(.)获得正确的标志,并arrange(c)确保顺序正确。或者,您可以使用 (1) arrange(desc(c))plusfuns(diff)或 (2) 明确引用前/后的内容,例如funs(.[c=="post"]-.[c=="pre"])(我认为后者会更明确)
  • 也许最有原则的方法是spread()分开前/后列,然后计算差异......但我不确定如何获得多个匹配的列对的差异......

推荐阅读