r - 如何使用其他列中的值作为键来减去特定列的值
问题描述
如何使用c
作为参考(post-pre)b
和d
作为键减去最后三列中的值?
输入
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()
解决方案
可能有更好的方法可以做到这一点,但我选择了
(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()
分开前/后列,然后计算差异......但我不确定如何获得多个匹配的列对的差异......
推荐阅读
- html - 在悬停弹性盒上显示另一个图像
- ruby-on-rails - 为什么rails要删除一个表,只是为了重命名一个列(sqlite)
- python - 通过条带引号和方括号来显示 pyparsing 的结果
- kubernetes - 是否可以通过自动化在 docker-for-windows 中打开 kubernetes 功能?
- java - 通过datagramsocket(Java)获取IOException接收datagrampakcet
- python - Discord 机器人写入 JSON
- algorithm - 我们有多少种不同的方式来对它们进行分组?
- javascript - setTimeout 函数完成时调用 Promise
- regex - 角形式输入块(空格)正则表达式
- mysql - 存储过程不返回记录