Как разделить два значения одной и той же переменной под одним именем? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть такой фрейм данных:

library(tidyverse)
a <- tibble(x=c("mother","father","brother","brother"),y=c("a","b","c","d"))
b <- tibble(x=c("mother","father","brother","brother"),z=c("e","f","g","h"))

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

Я пробовал fulljoin

 ab <- full_join(a,b,by="x")

и получил это:

    # A tibble: 6 x 3
  x       y     z    
  <chr>   <chr> <chr>
1 mother  a     e    
2 father  b     f    
3 brother c     g    
4 brother c     h    
5 brother d     g    
6 brother d     h 

Что мне нужно, это:

ab <- tibble(x=c("mother","father","brother1","brother2"),y=c("a","b","c","d"),z=c("e","f","g","h"))

# A tibble: 4 x 3
  x        y     z    
  <chr>    <chr> <chr>
1 mother   a     e    
2 father   b     f    
3 brother1 c     g    
4 brother2 d     h

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Используя dplyr, вы можете сделать что-то вроде следующего, добавив дополнительную переменную person, чтобы идентифицировать каждого человека в каждой группе в x, а затем соедините x и person:

library(dplyr)

a %>% 
    group_by(x) %>% 
    mutate(person = 1:n()) %>%
    full_join(b %>% 
                  group_by(x) %>%
                  mutate(person = 1:n()),
              by = c("x", "person")
              ) %>% 
    select(x, person, y, z)

Что возвращает:

# A tibble: 4 x 4
# Groups:   x [3]
  x       person y     z    
  <chr>    <int> <chr> <chr>
1 mother       1 a     e    
2 father       1 b     f    
3 brother      1 c     g    
4 brother      2 d     h  
1 голос
/ 04 июля 2019

К сожалению, первое и второе brother неразличимы друг от друга!Как R узнает, что вы хотите присоединиться к ним таким образом, а не наоборот?

Я бы попытался «удалить дубликаты» в исходных data.frame s, добавив идентификаторы «1» и «2»там.

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

a <- c("A", "B", "C", "C") 
a[duplicated(a)] <- paste0(a[duplicated(a)], 2) 
...