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;Row3 - row1;

另外,我写的代码对我来说似乎不是最好的(!),尽管它输出了我想要的结果,但不是所有可能的组合!

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来解决我的问题,我很感激,如果可能的话,使用整洁的诗句选项。

谢谢。

更新:一个整洁友好的解决方案:

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  

如果这是你所期望的,请告诉我。

my_df <- tibble(a=runif(5), b=runif(5), c=runif(5))
# Generating the sequence to calculate the combinations
seq1 <- seq(1,nrow(my_df)) 
seq2 <- seq1
# Generating the Combinations
Combinations <- expand.grid(seq1, seq2)
# Removing the dupilicate Combinations
Combinations <- Combinations[which(Combinations$Var2 < Combinations$Var1),]
# Performing the subtraction
result <- my_df[Combinations$Var1,] - my_df[Combinations$Var2,]

基于注释更新:

result <- expand.grid(seq1,seq1)%>%
filter(Var1 > Var2)%>%
mutate(my_df[Var1,] - my_df[Var2,])

相关内容

  • 没有找到相关文章

最新更新