如何求R中非均匀类中所有值的两两差

如何求R中非均匀类中所有值的两两差,r,dplyr,R,Dplyr,我找到了简单向量的解决方案,但是有没有一种方法可以对一个类别中的所有元素使用dplyr或base R来产生所有成对的差异 library(tidyverse) x = 1:10 y = rep(letters[1:5],each=2) z = rep(1:2,length.out =10) df = data.frame(x,y, z) df = rbind(df,c(11,"e",3)) df$verif = paste0(df$y,df$z) df$x = as.nume

我找到了简单向量的解决方案,但是有没有一种方法可以对一个类别中的所有元素使用dplyr或base R来产生所有成对的差异

library(tidyverse)
x = 1:10
y = rep(letters[1:5],each=2)
z = rep(1:2,length.out =10)
df = data.frame(x,y, z)
df = rbind(df,c(11,"e",3))
df$verif = paste0(df$y,df$z)
df$x = as.numeric(df$x)
df %>% 
  group_by(y) %>% 
  summarise(Diff = abs(x - lag(x)))
给出:

`summarise()` regrouping output by 'y' (override with `.groups` argument)
# A tibble: 11 x 2
# Groups:   y [5]
   y      Diff
   <chr> <dbl>
 1 a        NA
 2 a         1
 3 b        NA
 4 b         1
 5 c        NA
 6 c         1
 7 d        NA
 8 d         1
 9 e        NA
10 e         1
11 e         1
我现在需要得到,计算出的两两差异

又一次继续,弄得一团糟:

my.df=df %>% 
  group_by(y) %>% 
  summarise(Diff = combn(x,2,diff),
            test = combn(verif,2,paste, simplify = FALSE)) %>%  
  mutate(test2 = paste0(test, collapse = "-"))
my.df
> my.df
# A tibble: 7 x 4
# Groups:   y [5]
y      Diff test      test2                                                  
<chr> <dbl> <list>    <chr>                                                  
  1 a         1 <chr [2]> "c(\"a1\", \"a2\")"                                    
2 b         1 <chr [2]> "c(\"b1\", \"b2\")"                                    
3 c         1 <chr [2]> "c(\"c1\", \"c2\")"                                    
4 d         1 <chr [2]> "c(\"d1\", \"d2\")"                                    
5 e         1 <chr [2]> "c(\"e1\", \"e2\")-c(\"e1\", \"e3\")-c(\"e2\", \"e3\")"
6 e         2 <chr [2]> "c(\"e1\", \"e2\")-c(\"e1\", \"e3\")-c(\"e2\", \"e3\")"
7 e         1 <chr [2]> "c(\"e1\", \"e2\")-c(\"e1\", \"e3\")-c(\"e2\", \"e3\")"
my.df=df%>%
组别(y)%>%
总结(Diff=combn(x,2,Diff),
测试=combn(验证,2,粘贴,简化=FALSE))%>%
突变(test2=paste0(test,collapse=“-”))
我的.df
>我的.df
#一个tibble:7x4
#分组:y[5]
y差异测试2
1 a 1“c(\'a1\',\'a2\')”
2 b 1“c(\'b1\',\'b2\'”)
3 c 1“c(\'c1\',\'c2\')”
4 d 1“c(\“d1\”,“d2\”)
5 e 1“c(\“e1\”,“e2\”)-c(\“e1\”,“e3\”)-c(\“e2\”,“e3\”)
6 e 2“c”(“e1\”,“e2\”)-c(“e1\”,“e3\”)-c(“e2\”,“e3\”)
7 e 1“c(\“e1\”,“e2\”)-c(\“e1\”,“e3\”)-c(\“e2\”,“e3\”)
明白了:

library(tidyverse)
x = 1:10
y = rep(letters[1:5],each=2)
z = rep(1:2,length.out =10)
df = data.frame(x,y, z)
df = rbind(df,c(11,"e",3))
df$verif = paste0(df$y,df$z)
df$x = as.numeric(df$x)

my.df=df %>% 
  group_by(y) %>% 
  summarise(Diff = combn(x,2,diff),
            test = combn(verif,2,paste, simplify = FALSE)) %>%  
  mutate(test2 = unlist(lapply(test, function(x)paste(x,collapse="-")))) %>%  
  select(-test)
这是输出

my.df
# A tibble: 7 x 3
# Groups:   y [5]
  y      Diff test2
<chr> <dbl> <chr>
1 a         1 a1-a2
2 b         1 b1-b2
3 c         1 c1-c2
4 d         1 d1-d2
5 e         1 e1-e2
6 e         2 e1-e3
7 e         1 e2-e3
my.df
#一个tibble:7x3
#分组:y[5]
y差异测试2
a1-a2
2 b 1 b1-b2
3 c 1 c1-c2
4 d 1 d1-d2
5 e 1 e1-e2
6 e 2 e1-e3
7 e 1 e2-e3
您可以执行以下操作:

library(tidyverse)

df %>%
  group_by(y) %>%
  summarise(result = combn(seq_along(x), 2, function(i)
                     list(test1 = diff(x[i]),  #The difference
                          test2 = paste0(verif[i], collapse = '-')), # The pairs
                     simplify = FALSE),
             .groups = 'drop') %>%
  unnest_wider(result)

# A tibble: 7 x 3
  y     test1 test2
  <chr> <dbl> <chr>
1 a         1 a1-a2
2 b         1 b1-b2
3 c         1 c1-c2
4 d         1 d1-d2
5 e         1 e1-e2
6 e         2 e1-e3
7 e         1 e2-e3
库(tidyverse)
df%>%
组别(y)%>%
总结(结果=combn(沿(x)、2、功能(i)的顺序)
列表(test1=diff(x[i]),差异
test2=paste0(verif[i],collapse='-'),#这些对
简化=错误),
.groups='drop')%>%
unnest_加宽(结果)
#一个tibble:7x3
y测试1测试2
a1-a2
2 b 1 b1-b2
3 c 1 c1-c2
4 d 1 d1-d2
5 e 1 e1-e2
6 e 2 e1-e3
7 e 1 e2-e3

您可以在
summairse
步骤本身中执行此操作-
df%>%groupby(y)%%>%summary(Diff=combn(x,2,Diff),test=combn(verif,2,paste0,collapse='-')
library(tidyverse)

df %>%
  group_by(y) %>%
  summarise(result = combn(seq_along(x), 2, function(i)
                     list(test1 = diff(x[i]),  #The difference
                          test2 = paste0(verif[i], collapse = '-')), # The pairs
                     simplify = FALSE),
             .groups = 'drop') %>%
  unnest_wider(result)

# A tibble: 7 x 3
  y     test1 test2
  <chr> <dbl> <chr>
1 a         1 a1-a2
2 b         1 b1-b2
3 c         1 c1-c2
4 d         1 d1-d2
5 e         1 e1-e2
6 e         2 e1-e3
7 e         1 e2-e3