r - R - 计算行/观察值之间的列值差异(所有组合)
问题描述
我有一个 R 数据框,如下例所示。我希望计算观察/行(所有组合)之间列值的差异。
my_df <- tibble(a=runif(5), b=runif(5), c=runif(5))
> my_df
# A tibble: 5 x 3
a b c
<dbl> <dbl> <dbl>
1 0.0513 0.267 0.846
2 0.614 0.683 0.937
3 0.230 0.700 0.0651
4 0.671 0.110 0.901
5 0.424 0.520 0.817
我已经尝试过下面的代码,它只给了我后续行之间的区别;我想要所有组合:row2 - row1; 第 3 行 - 第 1 行;第 4 行 - 第 1 行,第 5 行 - 第 1 行,第 3 行 - 第 2 行,第 4 行 - 第 2 行,依此类推...
此外,我编写的代码对我来说似乎不是最好的(!),虽然它输出了我希望的结果,但不是所有可能的组合!
my_diff <- as.data.frame(diff(as.matrix(my_df)))
> my_diff
a b c
1 0.5623574 0.41522579 0.09165630
2 -0.3837289 0.01755953 -0.87209740
3 0.4407068 -0.58982681 0.83540813
4 -0.2463205 0.40943495 -0.08358985
如果有人可以提供帮助以使用 R 解决我的问题,我将不胜感激,如果可能的话,使用 tidy verse 选项。
谢谢。
解决方案
更新:一个整洁友好的解决方案:
library(tidyverse)
set.seed(1)
my_df <- tibble(a=runif(5), b=runif(5), c=runif(5))
给出:
# A tibble: 5 x 3
a b c
<dbl> <dbl> <dbl>
1 0.266 0.898 0.206
2 0.372 0.945 0.177
3 0.573 0.661 0.687
4 0.908 0.629 0.384
5 0.202 0.0618 0.770
从那里:
my_df %>%
mutate(ID = row_number()) %>%
slice(as.numeric(t(combn(1:nrow(.), 2)))) %>%
mutate(group = rep(1:(n()/2), 2)) %>%
group_by(group) %>%
summarize(comparison = paste0(ID[2], "-", ID[1]),
across(c(a, b, c), ~ .[2] - .[1])) %>%
select(-group)
这使:
# A tibble: 10 x 4
comparison a b c
<chr> <dbl> <dbl> <dbl>
1 2-1 0.107 0.0463 -0.0294
2 3-1 0.307 -0.238 0.481
3 4-1 0.643 -0.269 0.178
4 5-1 -0.0638 -0.837 0.564
5 3-2 0.201 -0.284 0.510
6 4-2 0.536 -0.316 0.208
7 5-2 -0.170 -0.883 0.593
8 4-3 0.335 -0.0317 -0.303
9 5-3 -0.371 -0.599 0.0828
10 5-4 -0.707 -0.567 0.386
推荐阅读
- bcrypt - 将 bcrypt 应用于已经散列的密码是否存在加密缺点
- javascript - ngOnDestroy 不会在页面重新加载时触发
- mysql - MySQL多行与将值全部存储在一个字符串中
- angularjs - 控制台返回错误数据
- graph - 为什么图处理难以分布式?
- mysql - 如何在数百万行中通过查询优化计数和排序
- sql - 存在三个表 A、B 和 C,其中我需要根据 B 中存在的公式将 C 中的值添加或连接到 A
- opc-ua - 使用 Eclipse milo 为 OPC UA 创建客户端,但在使用 ReadExample 时出错
- javascript - 在 DNN 站点中嵌入机器人
- vue.js - VUE DropDownList cascadeFrom不起作用