Отображение нескольких столбцов с помощью dplyr или tidyverse в R - PullRequest
0 голосов
/ 02 марта 2020

Мои данные похожи на следующие данные. Обратите внимание на две фамилии или имена, которые я здесь не упомянул

df1<-read.table(text= "id Surname Name
1234	Hamidsar	Smith
139	Sandarscom	Vicky
234	Bates	May
100	Murphu	Beki
941	Jool	Susan
469	Sali	John
990	susai	Alison",header=TRUE)

Другой кадр данных выглядит следующим образом:

df2<-read.table(text= "id Surname Name
990	susai	Anis
81B	Rosak	Roy
340	Molipoor	Vicky
139	Bates	May
941	Ameri	David
990	susai	Alison
139	Bates	May
101	CICI	Beki
139	Sandarscom	Vicky
1234	Hamidsar	Smith",header=TRUE)

Я хочу сопоставить идентификатор, фамилию и имя, чтобы получить следующую таблицу

id	Surname	Name	Map
1234	Hamidsar	Smith	id,Surname,Name
139	Sandarscom	Vicky	id,Surname,Name
234	Bates	May	Surname, Name
100	Murphu	Beki	Name
941	Jool	Susan	id
469	Sali	John	NA
990	susai	Alison	id,Surname,Name

Возможно ли это получить? Я прочитал некоторые ссылки, но они мне не помогли

1 Ответ

2 голосов
/ 02 марта 2020
  library(tidyverse)
  library(glue)

Во-первых, я устанавливаю stringsAsFactors=FALSE для вашего кода, чтобы получить данные, чтобы избежать неприятностей в будущем.

  df1<-read.table(text= "id Surname Name
1234    Hamidsar    Smith
139 Sandarscom  Vicky
234 Bates   May
100 Murphu  Beki
941 Jool    Susan
469 Sali    John
990 susai   Alison",header=TRUE, stringsAsFactors=FALSE)

  df2<-read.table(text= "id Surname Name
990 susai   Anis
81B Rosak   Roy
340 Molipoor    Vicky
139 Bates   May
941 Ameri   David
990 susai   Alison
139 Bates   May
101 CICI    Beki
139 Sandarscom  Vicky
1234    Hamidsar    Smith",header=TRUE, stringsAsFactors=FALSE)

Ниже я проверяю, что id установлен на тип символа, так что это то же самое в df2, а затем я просто применяю поиск, чтобы сказать «если это значение в df2, показать имя переменной, иначе ничего». Затем я использую glue, чтобы соединить их в переменную Map.

  df1 %>% 
    mutate(id = as.character(id),
           Map_id = if_else(id %in% df2$id, "id", NA_character_),
           Map_Surname = if_else(Surname %in% df2$Surname, "Surname", NA_character_),
           Map_Name = if_else(Name %in% df2$Name, "Name", NA_character_),
           Map = glue("{Map_id} {Map_Surname} {Map_Name}", .na = "") %>% 
             str_trim() %>% 
             str_replace_all(" ", ", ")) %>% 
    select(id, Surname, Name, Map)

#>     id    Surname   Name               Map
#> 1 1234   Hamidsar  Smith id, Surname, Name
#> 2  139 Sandarscom  Vicky id, Surname, Name
#> 3  234      Bates    May     Surname, Name
#> 4  100     Murphu   Beki              Name
#> 5  941       Jool  Susan                id
#> 6  469       Sali   John                  
#> 7  990      susai Alison id, Surname, Name
...