Как удалить повторяющиеся столбцы после соединения dplyr? - PullRequest
0 голосов
/ 06 мая 2020

Рассмотрим два фрейма данных, df1 и df2 .
df1 имеет столбцы id , a , b .
df2 имеет столбцы id , a , c.

Я хочу выполнить левое соединение, чтобы объединенный фрейм данных имел столбцы id , a , b , c .

combined <- df1 %>% left_join(df2, by="id")

Но в объединенном фрейме данных столбцы: id , ax , b , ay , c.

Я могу включить «a» в ключ соединения (например: left_join(df1, df2, by=c("id", "a"))), но столбцов слишком много, например a . Я хочу присоединиться только по первичному ключу id и удалить все повторяющиеся столбцы в df2.

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Более общий подход c заключался бы в том, чтобы отбросить столбцы перед левым соединением, иначе ваш объединенный набор данных может быть изначально очень большим:

df1<- data.frame(id= seq(1:0), a=rnorm(1:10,0.2),b=rpois(10,0.2))
df2<- data.frame(id= seq(1:0), a=rnorm(1:10,0.2),c=rnorm(10,0.2))

varList<- names(df2)[!(names(df2) %in% names(df1))] # get non common names
varList<- c(varList,"id") # appending key parameter

combined <- df1 %>% left_join((df2 %>% select(varList)), by="id")

объединенный набор данных не будет иметь никаких .x или .y

0 голосов
/ 06 мая 2020

По "слишком много столбцов, таких как"". Вы имеете в виду, что хотите найти все столбцы, общие для обоих источников? В таком случае, почему бы не использовать буквально пересечение (поведение по умолчанию)?

## two data.frames, only id = 3, a = 4 matches
(df1 <- data.frame(id = 1:3, a = 2:4, b = 3:5))
#>   id a b
#> 1  1 2 3
#> 2  2 3 4
#> 3  3 4 5
(df2 <- data.frame(id = 3:2, a = 4:5, c = 1:2))
#>   id a c
#> 1  3 4 1
#> 2  2 5 2

## this produces a.x and a.y                  
dplyr::left_join(df1, df2, by = "id")
#>   id a.x b a.y  c
#> 1  1   2 3  NA NA
#> 2  2   3 4   5  2
#> 3  3   4 5   4  1

## which columns are common?
intersect(names(df1), names(df2))
#> [1] "id" "a"

## this produces id, a, b, c
dplyr::left_join(df1, df2, by = intersect(names(df1), names(df2)))
#>   id a b  c
#> 1  1 2 3 NA
#> 2  2 3 4 NA
#> 3  3 4 5  1

## this is, however, the default behaviour for left_join
## i.e. use all columns which are present in both
dplyr::left_join(df1, df2)
#> Joining, by = c("id", "a")
#>   id a b  c
#> 1  1 2 3 NA
#> 2  2 3 4 NA
#> 3  3 4 5  1

Создано 06.05.2020 с помощью пакета (v0.3.0)

0 голосов
/ 06 мая 2020

Сначала мы выполняем соединение по id

combined <- df1 %>% left_join(df2, by="id")

Затем мы переименовываем их с помощью .x и отбрасываем их с помощью .y

combined <- combined %>% 
  rename_at(
    vars(ends_with(".x")),
    ~str_replace(., "\\..$","")
  ) %>% 
  select_at(
    vars(-ends_with(".y"))
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...