Как выполнить взаимодействие двух столбцов DF без перестановок в R? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть data.frame в R, который имеет значения для пар регионов.Первые столбцы могут быть построены с кодом:

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)

Я хотел бы построить график с разными коллорами для каждой пары регионов, поэтому я попробовал

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

Однако,результат оказался не таким, как я ожидал, после того, как были рассмотрены варианты одного и того же взаимодействия.

enter image description here

Как показано на рисунке , есть, например, группа SW.SE и SE.SW.

Я хотел бы спросить, как я мог разумным образом создать группы пар без перестановок.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вот два варианта dplyr.Оба включают сортировку значений двух областей для каждой пары (x, y).Первый использует mutate для вставки отсортированных значений, сделанных с rowwise.Второй использует gather, чтобы создать один столбец областей, упорядочить их по парам (x, y), а затем summarise s, вставив их вместе.

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)

Создано в 2018-05-22 с помощью представительного пакета (v0.2.0).

0 голосов
/ 20 августа 2018

Приведенные выше решения работают должным образом, и тогда я нашел более быстрое решение, при котором не нужно знать индексы на фрейме данных, основанные на мутировании и вставке.Для выбора заказа используется ifelse:

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 голосов
/ 23 мая 2018

Используя данные вашего примера, вы можете apply над строками, а затем sort областями, а затем collapse их в виде элемента взаимодействия следующим образом:

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))

В результате:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...