J'ai un data.frame dans R qui a des valeurs pour des paires de régions. Les premières colonnes peuvent être construites avec le code:

region.1 <- c("SE", "SE", "SW", "S", "SW")
region.2 <- c("SW",  "S", "SE", "SE", "SE")
x <- c(1,2,3,4,5)
y <- c(1,3,2,4,1)

df <- data.frame(x,y,region.1,region.2)

Je voudrais faire un tracé avec des couleurs différentes pour chaque paire de régions, j'ai donc essayé

ggplot(data=df, aes(x=x, y=y))+
    geom_point(size=5,aes(color=interaction(region.1,region.2)))

Cependant, le résultat n'était pas ce à quoi je m'attendais, une fois que les permutations de la même interaction ont été prises en compte.

enter image description here

Comme le montre l'image, il y a le groupe SW.SE et SE.SW, pour exemple.

Je voudrais demander comment pourrais-je faire, de manière intelligente, des groupes de paires sans les permutations.

0
André Costa 23 mai 2018 à 00:19

3 réponses

Meilleure réponse

Voici deux options basées sur dplyr. Les deux impliquent de trier les valeurs des deux régions pour chaque paire (x, y). Le premier utilise mutate pour coller les valeurs triées, fait avec rowwise. Le second utilise gather pour créer une seule colonne de régions, les arranger par paires de (x, y), puis summarise les régions en les collant ensemble.

library(tidyverse)
region.1 <- c("SE", "SE", "SW", "S", "SW")
region.2 <- c("SW",  "S", "SE", "SE", "SE")
x <- c(1,2,3,4,5)
y <- c(1,3,2,4,1)

df <- data.frame(x,y,region.1,region.2)

df_interact1 <- df %>%
  mutate_if(is.factor, as.character) %>%
  rowwise() %>% 
  mutate(interact = sort(c(region.1, region.2)) %>% paste(., collapse = ".")) %>%
  ungroup()


df_interact1
#> # A tibble: 5 x 5
#>       x     y region.1 region.2 interact
#>   <dbl> <dbl> <chr>    <chr>    <chr>   
#> 1     1     1 SE       SW       SE.SW   
#> 2     2     3 SE       S        S.SE    
#> 3     3     2 SW       SE       SE.SW   
#> 4     4     4 S        SE       S.SE    
#> 5     5     1 SW       SE       SE.SW

ggplot(df_interact1, aes(x = x, y = y, color = interact)) +
  geom_point(size = 5)

df_interact2 <- df %>%
  gather(key = region, value = value, region.1, region.2) %>%
  group_by(x, y) %>%
  arrange(value) %>%
  summarise(interact = paste(min(value), max(value), sep = ".")) %>%
  ungroup()

df_interact2
#> # A tibble: 5 x 3
#>       x     y interact
#>   <dbl> <dbl> <chr>   
#> 1     1     1 SE.SW   
#> 2     2     3 S.SE    
#> 3     3     2 SE.SW   
#> 4     4     4 S.SE    
#> 5     5     1 SE.SW

ggplot(df_interact2, aes(x = x, y = y, color = interact)) +
  geom_point(size = 5)

Créé le 22/05/2018 par le package reprex (v0.2.0).

2
camille 23 mai 2018 à 02:37

À l'aide de vos exemples de données, vous pouvez apply sur les lignes, puis sort les régions, puis les collapse en un terme d'interaction comme suit:

df$interaction <- apply(df, 1, function(x){paste(sort(c(x[3],x[4])), collapse = ".")})
ggplot(data=df, aes(x=x, y=y))+
  geom_point(size=5,aes(color=interaction))

Résultant en:

enter image description here

2
GordonShumway 22 mai 2018 à 23:15

Les solutions ci-dessus fonctionnent correctement, sur la base de laquelle j'ai trouvé une solution plus rapide où l'on n'a pas besoin de connaître les index sur la trame de données, basée sur la mutation et la pâte. Un ifelse est utilisé pour choisir la commande:

library(dplyr)
df<-df %>% mutate (
           region.1=as.character(region.1),
           region.2=as.character(region.2),
           interact = ifelse(region.1<region.2,
                                paste(region.1,region.2,sep="."),
                                paste(region.2,region.1,sep=".")))
0
André Costa 20 août 2018 à 14:52